|
|
@@ -81,6 +81,9 @@ VAR
|
|
|
declaration; DeclSeq folds these into an NkDeclSeq. *)
|
|
|
astDecl: AST.Node;
|
|
|
|
|
|
+ (* Unit-AST root (slice 7): NkUnit(name, decls, body). *)
|
|
|
+ astUnit: AST.Node;
|
|
|
+
|
|
|
(* Class of the method named by the last `obj.Method` designator
|
|
|
(InvalidType when the callee is an ordinary procedure). Set by
|
|
|
Design, consumed by the following ArgList. *)
|
|
|
@@ -218,6 +221,11 @@ PRODUCTIONS
|
|
|
| ProcHeading<pn, SymTab.InvalidType> ";"
|
|
|
(. SymTab.CloseProc;
|
|
|
QbeGen.AbortFunc; .) }
|
|
|
+ (. astUnit := AST.MakeNode(AST.NkUnit);
|
|
|
+ AST.SetChild(astUnit, 0,
|
|
|
+ AST.MakeLeaf(AST.NkIdent, m1));
|
|
|
+ astDecl := AST.NoNode;
|
|
|
+ astStmt := AST.NoNode; .)
|
|
|
"END"
|
|
|
GetIdent<m2> (. IF NOT SymTab.Equal(m1, m2) THEN
|
|
|
SemError(202) END;
|
|
|
@@ -225,10 +233,13 @@ PRODUCTIONS
|
|
|
ImplUnit (. VAR m1, m2: SymTab.Name;
|
|
|
k: CARDINAL;
|
|
|
fname: SymTab.Name;
|
|
|
- unres: BOOLEAN; .)
|
|
|
+ unres: BOOLEAN;
|
|
|
+ astNode: AST.Node; .)
|
|
|
= "IMPLEMENTATION" "MODULE"
|
|
|
- GetIdent<m1> (. IF NOT SymTab.BeginImpl(m1) THEN
|
|
|
+ GetIdent<m1> (. IF NOT SymTab.BeginImpl(m1) THEN
|
|
|
SemError(201) END;
|
|
|
+ astStmt := AST.NoNode;
|
|
|
+ astDecl := AST.NoNode;
|
|
|
nPendVar := 0;
|
|
|
QbeGen.SetModule(m1); .)
|
|
|
";"
|
|
|
@@ -255,16 +266,25 @@ PRODUCTIONS
|
|
|
END;
|
|
|
SymTab.FwdClear;
|
|
|
FwdVarFlush;
|
|
|
+ astNode := AST.MakeNode(AST.NkUnit);
|
|
|
+ AST.SetChild(astNode, 0,
|
|
|
+ AST.MakeLeaf(AST.NkIdent, m1));
|
|
|
+ AST.SetChild(astNode, 1, astDecl);
|
|
|
+ AST.SetChild(astNode, 2, astStmt);
|
|
|
+ astUnit := astNode;
|
|
|
IF NOT SymTab.Equal(m1, m2) THEN
|
|
|
SemError(202) END;
|
|
|
SymTab.EndUnit; .) .
|
|
|
ProgModule (. VAR m1, m2: SymTab.Name;
|
|
|
k: CARDINAL;
|
|
|
fname: SymTab.Name;
|
|
|
- unres: BOOLEAN; .)
|
|
|
+ unres: BOOLEAN;
|
|
|
+ astNode: AST.Node; .)
|
|
|
= "MODULE"
|
|
|
- GetIdent<m1> (. IF NOT SymTab.BeginProg(m1) THEN
|
|
|
+ GetIdent<m1> (. IF NOT SymTab.BeginProg(m1) THEN
|
|
|
SemError(200) END;
|
|
|
+ astStmt := AST.NoNode;
|
|
|
+ astDecl := AST.NoNode;
|
|
|
nPendVar := 0;
|
|
|
QbeGen.SetModule(m1); .)
|
|
|
[ Priority ]
|
|
|
@@ -294,6 +314,12 @@ PRODUCTIONS
|
|
|
FwdVarFlush;
|
|
|
IF NOT SymTab.Equal(m1, m2) THEN
|
|
|
SemError(202) END;
|
|
|
+ astNode := AST.MakeNode(AST.NkUnit);
|
|
|
+ AST.SetChild(astNode, 0,
|
|
|
+ AST.MakeLeaf(AST.NkIdent, m1));
|
|
|
+ AST.SetChild(astNode, 1, astDecl);
|
|
|
+ AST.SetChild(astNode, 2, astStmt);
|
|
|
+ astUnit := astNode;
|
|
|
QbeGen.EndModule(m1);
|
|
|
SymTab.EndUnit; .) .
|
|
|
DeclSeq (. VAR astSeq: AST.Node; .)
|
|
|
@@ -1096,11 +1122,24 @@ PRODUCTIONS
|
|
|
dk: INTEGER;
|
|
|
qd, qe: QbeGen.QVal;
|
|
|
qn: SymTab.Name;
|
|
|
- sfx, isInc: BOOLEAN; .)
|
|
|
+ sfx, isInc: BOOLEAN;
|
|
|
+ astNode, astD: AST.Node; .)
|
|
|
= ( "INCL" (. isInc := TRUE; .)
|
|
|
| "EXCL" (. isInc := FALSE; .) )
|
|
|
- "(" Design<at, dk, qd, qn, sfx> ","
|
|
|
+ "(" Design<at, dk, qd, qn, sfx> (. astD := astCur; .) ","
|
|
|
Expr<et2, qe> ")"
|
|
|
+ (. astNode := AST.MakeNode(AST.NkCall);
|
|
|
+ IF isInc THEN
|
|
|
+ AST.SetChild(astNode, 0,
|
|
|
+ AST.MakeLeaf(AST.NkIdent, "INCL"))
|
|
|
+ ELSE AST.SetChild(astNode, 0,
|
|
|
+ AST.MakeLeaf(AST.NkIdent, "EXCL"))
|
|
|
+ END;
|
|
|
+ IF astD # AST.NoNode THEN
|
|
|
+ AST.SetChild(astNode, 1, astD) END;
|
|
|
+ IF astCur # AST.NoNode THEN
|
|
|
+ AST.SetChild(astNode, 2, astCur) END;
|
|
|
+ astStmt := astNode; .)
|
|
|
(. IF at = SymTab.InvalidType THEN
|
|
|
ELSIF SymTab.ClassOf(at) #
|
|
|
SymTab.ClSet THEN
|
|
|
@@ -1123,14 +1162,27 @@ PRODUCTIONS
|
|
|
qd, qv, qn2, qstep:
|
|
|
QbeGen.QVal;
|
|
|
qn: SymTab.Name;
|
|
|
- sfx, isInc: BOOLEAN; .)
|
|
|
+ sfx, isInc: BOOLEAN;
|
|
|
+ astNode, astD, astStep:
|
|
|
+ AST.Node; .)
|
|
|
= (. isInc := TRUE; .)
|
|
|
( "INC" (. isInc := TRUE; .)
|
|
|
| "DEC" (. isInc := FALSE; .) )
|
|
|
- "(" (. QbeGen.CopyOp("1", qstep); .)
|
|
|
- Design<dt, dk, qd, qn, sfx>
|
|
|
- [ "," Expr<et2, qstep> ]
|
|
|
- ")" (. IF dt = SymTab.InvalidType THEN
|
|
|
+ "(" (. QbeGen.CopyOp("1", qstep); astStep := AST.NoNode; .)
|
|
|
+ Design<dt, dk, qd, qn, sfx> (. astD := astCur; .)
|
|
|
+ [ "," Expr<et2, qstep> (. astStep := astCur; .) ]
|
|
|
+ ")" (. astNode := AST.MakeNode(AST.NkCall);
|
|
|
+ IF isInc THEN
|
|
|
+ AST.SetChild(astNode, 0,
|
|
|
+ AST.MakeLeaf(AST.NkIdent, "INC"))
|
|
|
+ ELSE AST.SetChild(astNode, 0,
|
|
|
+ AST.MakeLeaf(AST.NkIdent, "DEC"))
|
|
|
+ END;
|
|
|
+ IF astD # AST.NoNode THEN
|
|
|
+ AST.SetChild(astNode, 1, astD) END;
|
|
|
+ IF astStep # AST.NoNode THEN
|
|
|
+ AST.SetChild(astNode, 2, astStep) END;
|
|
|
+ astStmt := astNode; .) (. IF dt = SymTab.InvalidType THEN
|
|
|
ELSIF (dk # SymTab.KindVar)
|
|
|
AND (dk # SymTab.KindParam)
|
|
|
AND (dk # SymTab.KindField) THEN
|
|
|
@@ -1167,8 +1219,15 @@ PRODUCTIONS
|
|
|
qd, qm: QbeGen.QVal;
|
|
|
qn: SymTab.Name;
|
|
|
sfx: BOOLEAN;
|
|
|
- bt: SymTab.TypeIndex; .)
|
|
|
- = "NEW" "(" Design<dt, dk, qd, qn, sfx> ")"
|
|
|
+ bt: SymTab.TypeIndex;
|
|
|
+ astNode, astD: AST.Node; .)
|
|
|
+ = "NEW" "(" Design<dt, dk, qd, qn, sfx> (. astD := astCur; .) ")"
|
|
|
+ (. astNode := AST.MakeNode(AST.NkCall);
|
|
|
+ AST.SetChild(astNode, 0,
|
|
|
+ AST.MakeLeaf(AST.NkIdent, "NEW"));
|
|
|
+ IF astD # AST.NoNode THEN
|
|
|
+ AST.SetChild(astNode, 1, astD) END;
|
|
|
+ astStmt := astNode; .)
|
|
|
(. IF dt = SymTab.InvalidType THEN
|
|
|
ELSIF (dk # SymTab.KindVar)
|
|
|
AND (dk # SymTab.KindParam)
|
|
|
@@ -1196,8 +1255,15 @@ PRODUCTIONS
|
|
|
dk: INTEGER;
|
|
|
qd, qv: QbeGen.QVal;
|
|
|
qn: SymTab.Name;
|
|
|
- sfx: BOOLEAN; .)
|
|
|
- = "DISPOSE" "(" Design<dt, dk, qd, qn, sfx> ")"
|
|
|
+ sfx: BOOLEAN;
|
|
|
+ astNode, astD: AST.Node; .)
|
|
|
+ = "DISPOSE" "(" Design<dt, dk, qd, qn, sfx> (. astD := astCur; .) ")"
|
|
|
+ (. astNode := AST.MakeNode(AST.NkCall);
|
|
|
+ AST.SetChild(astNode, 0,
|
|
|
+ AST.MakeLeaf(AST.NkIdent, "DISPOSE"));
|
|
|
+ IF astD # AST.NoNode THEN
|
|
|
+ AST.SetChild(astNode, 1, astD) END;
|
|
|
+ astStmt := astNode; .)
|
|
|
(. IF dt = SymTab.InvalidType THEN
|
|
|
ELSIF (dk # SymTab.KindVar)
|
|
|
AND (dk # SymTab.KindParam)
|