summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2025-06-23 01:23:31 +0200
committerVladimir Azarov <avm@intermediate-node.net>2025-06-23 01:37:22 +0200
commit0a091754ea2d9944e35215d67604c58c6f874cbd (patch)
treed8bb42a135b5d212f1f26e834cea5d6dd4faf7c0
parent403a326aea9a3931e433f581448578144ec5014f (diff)
Compliant abstract declarators
-rw-r--r--parser.fun22
1 files changed, 18 insertions, 4 deletions
diff --git a/parser.fun b/parser.fun
index c11e53b..e0cd0ba 100644
--- a/parser.fun
+++ b/parser.fun
@@ -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