diff options
author | Vladimir Azarov <avm@intermediate-node.net> | 2025-06-23 01:23:31 +0200 |
---|---|---|
committer | Vladimir Azarov <avm@intermediate-node.net> | 2025-06-23 01:37:22 +0200 |
commit | 0a091754ea2d9944e35215d67604c58c6f874cbd (patch) | |
tree | d8bb42a135b5d212f1f26e834cea5d6dd4faf7c0 | |
parent | 403a326aea9a3931e433f581448578144ec5014f (diff) |
Compliant abstract declarators
-rw-r--r-- | parser.fun | 22 |
1 files changed, 18 insertions, 4 deletions
@@ -700,7 +700,7 @@ functor Parser(structure Tree: TREE; structure P: PPC): PARSER = struct and parseTypeInParens tk ctx = case tk of TkParens list => - if isTypeNameStart (#1 $ hd list) handle Empty => false then + if isTypeNameStart (#1 $ hd list) then let val (ctype, ctx) = ctxWithLayer ctx list parseTypeName in @@ -1429,26 +1429,40 @@ functor Parser(structure Tree: TREE; structure P: PPC): PARSER = struct (parts, ctx) end + and isParams list = + case (#1 $ hd list) of + Tk T.EOS => true + | tk => isTypeNameStart tk + and parseDDeclarator (untilEnd, absPolicy) ctx parts = let val (tk, pos, ctx') = getTokenCtx ctx val isEOS = fn Tk T.EOS => true | _ => false + val consAbstruct = fn () => (AbstructRoot pos :: parts, ctx) val (parts, ctx) = case (tk, absPolicy) of (Tk (T.Id _), APenforced) => P.error pos `"unexpected identifier in abstract declarator" % | (Tk (T.Id id), _) => (Id (id, pos) :: parts, ctx') - | (TkParens list, _) => ctxWithLayer ctx' list - (parseDeclarator (true, absPolicy) parts) + | (TkParens list, _) => ( + case (isParams list, absPolicy) of + (true, APprohibited) => + P.clerror (#2 $ hd list) [P.Cid, P.Ctk T.Asterisk] + | (true, _) => consAbstruct () + | (false, _) => ctxWithLayer ctx' list + (parseDeclarator (true, absPolicy) parts) + ) + | (TkBrackets _, APenforced) | (TkBrackets _, APpermitted) => + consAbstruct () | (_, APprohibited) => P.clerror pos [P.Cid, P.Ctk T.LParen] | (_, _) => if untilEnd andalso not (isEOS tk) then P.error pos `"expected abstruct declarator end" % else - (AbstructRoot pos :: parts, ctx) + consAbstruct () in collectDDeclaratorTail parts untilEnd ctx end |