|
@@ -14,7 +14,7 @@ COMPILER M2comp
|
|
|
unary minus takes a Factor (3.3), abbreviated arrays (3.1),
|
|
unary minus takes a Factor (3.3), abbreviated arrays (3.1),
|
|
|
no octal B/C (2.1). "~" never added (2.2); "<>" still accepted. *)
|
|
no octal B/C (2.1). "~" never added (2.2); "<>" still accepted. *)
|
|
|
|
|
|
|
|
-IMPORT SymTab;
|
|
|
|
|
|
|
+IMPORT SymTab, AST;
|
|
|
|
|
|
|
|
CHARACTERS
|
|
CHARACTERS
|
|
|
eol = CHR(13) .
|
|
eol = CHR(13) .
|
|
@@ -46,162 +46,215 @@ PRODUCTIONS
|
|
|
the messages still name the right tokens. *)
|
|
the messages still name the right tokens. *)
|
|
|
M2comp
|
|
M2comp
|
|
|
= Module "." .
|
|
= Module "." .
|
|
|
- Module (. VAR m1, m2: SymTab.Name; .)
|
|
|
|
|
- = (. SymTab.Init; .)
|
|
|
|
|
|
|
+ Module (. VAR m1, m2: SymTab.Name;
|
|
|
|
|
+ d, bd, bs, rt: AST.Node;
|
|
|
|
|
+ im: AST.Node; .)
|
|
|
|
|
+ = (. SymTab.Init; d := NIL; .)
|
|
|
"MODULE"
|
|
"MODULE"
|
|
|
GetIdent<m1>
|
|
GetIdent<m1>
|
|
|
";"
|
|
";"
|
|
|
- { Import }
|
|
|
|
|
- Block
|
|
|
|
|
|
|
+ { Import<im> (. d := AST.Append(d, im); .) }
|
|
|
|
|
+ Block<bd, bs> (. d := AST.Append(d, bd);
|
|
|
|
|
+ rt := AST.MkModule(m1, d,
|
|
|
|
|
+ AST.MkBlock(NIL, bs));
|
|
|
|
|
+ AST.SetRoot(rt); .)
|
|
|
GetIdent<m2> (. IF ~SymTab.Equal(m1, m2) THEN
|
|
GetIdent<m2> (. IF ~SymTab.Equal(m1, m2) THEN
|
|
|
SemError(202) END;
|
|
SemError(202) END;
|
|
|
- SymTab.PrintTable; .) .
|
|
|
|
|
- Import (. VAR n: SymTab.Name; .)
|
|
|
|
|
- = [ "FROM"
|
|
|
|
|
- GetIdent<n> (. IF ~SymTab.Enter(n,
|
|
|
|
|
|
|
+ SymTab.PrintTable;
|
|
|
|
|
+ AST.DumpTree(
|
|
|
|
|
+ AST.GetRoot()); .) .
|
|
|
|
|
+ Import<VAR n: AST.Node> (. VAR mod: SymTab.Name;
|
|
|
|
|
+ h: AST.Node;
|
|
|
|
|
+ m: SymTab.Name; .)
|
|
|
|
|
+ = (. mod[0] := 0C; .)
|
|
|
|
|
+ [ "FROM"
|
|
|
|
|
+ GetIdent<m> (. IF ~SymTab.Enter(m,
|
|
|
SymTab.KindImport)
|
|
SymTab.KindImport)
|
|
|
- THEN SemError(200) END; .) ]
|
|
|
|
|
|
|
+ THEN SemError(200) END;
|
|
|
|
|
+ mod := m; .) ]
|
|
|
"IMPORT"
|
|
"IMPORT"
|
|
|
- IdentList
|
|
|
|
|
- ";" .
|
|
|
|
|
- IdentList (. VAR n: SymTab.Name; .)
|
|
|
|
|
|
|
+ IdentList<h>
|
|
|
|
|
+ ";" (. n := AST.MkImport(mod, h); .) .
|
|
|
|
|
+ IdentList<VAR h: AST.Node> (. VAR n: SymTab.Name; .)
|
|
|
= GetIdent<n> (. IF ~SymTab.Enter(n,
|
|
= GetIdent<n> (. IF ~SymTab.Enter(n,
|
|
|
SymTab.KindImport)
|
|
SymTab.KindImport)
|
|
|
- THEN SemError(200) END; .)
|
|
|
|
|
|
|
+ THEN SemError(200) END;
|
|
|
|
|
+ h := AST.MkImpName(n); .)
|
|
|
{ ","
|
|
{ ","
|
|
|
GetIdent<n> (. IF ~SymTab.Enter(n,
|
|
GetIdent<n> (. IF ~SymTab.Enter(n,
|
|
|
SymTab.KindImport)
|
|
SymTab.KindImport)
|
|
|
- THEN SemError(200) END; .) } .
|
|
|
|
|
|
|
+ THEN SemError(200) END;
|
|
|
|
|
+ h := AST.Append(h,
|
|
|
|
|
+ AST.MkImpName(n)); .) } .
|
|
|
GetIdent<VAR n: SymTab.Name>
|
|
GetIdent<VAR n: SymTab.Name>
|
|
|
= ident (. LexName(n); .) .
|
|
= ident (. LexName(n); .) .
|
|
|
- Block
|
|
|
|
|
- = { Declaration }
|
|
|
|
|
|
|
+ Block<VAR d: AST.Node; VAR s: AST.Node>
|
|
|
|
|
+ (. VAR dn: AST.Node; .)
|
|
|
|
|
+ = (. d := NIL; s := NIL; .)
|
|
|
|
|
+ { Declaration<dn> (. d := AST.Append(d, dn); .) }
|
|
|
[ "BEGIN"
|
|
[ "BEGIN"
|
|
|
- StatSeq ]
|
|
|
|
|
|
|
+ StatSeq<s> ]
|
|
|
"END" .
|
|
"END" .
|
|
|
- Declaration
|
|
|
|
|
- = "CONST"
|
|
|
|
|
- { ConstDecl ";" }
|
|
|
|
|
- | "TYPE"
|
|
|
|
|
- { TypeDecl ";" }
|
|
|
|
|
- | "VAR"
|
|
|
|
|
- { VarDecl ";" }
|
|
|
|
|
- | ProcDecl
|
|
|
|
|
|
|
+ Declaration<VAR n: AST.Node> (. VAR cn: AST.Node; .)
|
|
|
|
|
+ = "CONST" (. n := NIL; .)
|
|
|
|
|
+ { ConstDecl<cn> ";" (. n := AST.Append(n, cn); .) }
|
|
|
|
|
+ | "TYPE" (. n := NIL; .)
|
|
|
|
|
+ { TypeDecl<cn> ";" (. n := AST.Append(n, cn); .) }
|
|
|
|
|
+ | "VAR" (. n := NIL; .)
|
|
|
|
|
+ { VarDecl<cn> ";" (. n := AST.Append(n, cn); .) }
|
|
|
|
|
+ | ProcDecl<n>
|
|
|
";"
|
|
";"
|
|
|
- | ModuleDecl
|
|
|
|
|
|
|
+ | ModuleDecl<n>
|
|
|
";" .
|
|
";" .
|
|
|
- ConstDecl (. VAR n: SymTab.Name;
|
|
|
|
|
- t: SymTab.TypeIndex; .)
|
|
|
|
|
- = GetIdent<n> (. IF ~SymTab.Enter(n,
|
|
|
|
|
|
|
+ ConstDecl<VAR n: AST.Node> (. VAR nm: SymTab.Name;
|
|
|
|
|
+ t: SymTab.TypeIndex;
|
|
|
|
|
+ en: AST.Node; .)
|
|
|
|
|
+ = GetIdent<nm> (. IF ~SymTab.Enter(nm,
|
|
|
SymTab.KindConst)
|
|
SymTab.KindConst)
|
|
|
THEN SemError(200) END; .)
|
|
THEN SemError(200) END; .)
|
|
|
"="
|
|
"="
|
|
|
- ConstExpr<t> (. SymTab.SetSymType(n, t); .) .
|
|
|
|
|
- ConstExpr<VAR t: SymTab.TypeIndex>
|
|
|
|
|
|
|
+ ConstExpr<t, en> (. SymTab.SetSymType(nm, t);
|
|
|
|
|
+ n := AST.MkConst(nm, en,
|
|
|
|
|
+ t); .) .
|
|
|
|
|
+ ConstExpr<VAR t: SymTab.TypeIndex; VAR e: AST.Node>
|
|
|
(. VAR vD: BOOLEAN; .)
|
|
(. VAR vD: BOOLEAN; .)
|
|
|
- = Expr<t, vD> .
|
|
|
|
|
- TypeDecl (. VAR n: SymTab.Name;
|
|
|
|
|
|
|
+ = Expr<t, vD, e> .
|
|
|
|
|
+ TypeDecl<VAR n: AST.Node> (. VAR nm: SymTab.Name;
|
|
|
t0, t1: SymTab.TypeIndex; .)
|
|
t0, t1: SymTab.TypeIndex; .)
|
|
|
- = GetIdent<n> (. IF ~SymTab.Enter(n,
|
|
|
|
|
|
|
+ = GetIdent<nm> (. IF ~SymTab.Enter(nm,
|
|
|
SymTab.KindType)
|
|
SymTab.KindType)
|
|
|
THEN SemError(200) END;
|
|
THEN SemError(200) END;
|
|
|
t0 := SymTab.NewAlias();
|
|
t0 := SymTab.NewAlias();
|
|
|
- SymTab.SetSymType(n, t0); .)
|
|
|
|
|
|
|
+ SymTab.SetSymType(nm, t0); .)
|
|
|
"="
|
|
"="
|
|
|
Type<t1> (. IF t1 = t0 THEN SemError(223);
|
|
Type<t1> (. IF t1 = t0 THEN SemError(223);
|
|
|
SymTab.SetTarget(t0,
|
|
SymTab.SetTarget(t0,
|
|
|
SymTab.InvalidType)
|
|
SymTab.InvalidType)
|
|
|
- ELSE SymTab.SetTarget(t0, t1) END; .) .
|
|
|
|
|
- VarDecl (. VAR t: SymTab.TypeIndex; .)
|
|
|
|
|
- = VarIdents ":"
|
|
|
|
|
|
|
+ ELSE SymTab.SetTarget(t0, t1) END;
|
|
|
|
|
+ n := AST.MkTypeDecl(nm,
|
|
|
|
|
+ t1); .) .
|
|
|
|
|
+ VarDecl<VAR n: AST.Node> (. VAR t: SymTab.TypeIndex;
|
|
|
|
|
+ h: AST.Node; .)
|
|
|
|
|
+ = VarIdents<h> ":"
|
|
|
Type<t> (. IF SymTab.IsOpen(t) THEN
|
|
Type<t> (. IF SymTab.IsOpen(t) THEN
|
|
|
SemError(230) END;
|
|
SemError(230) END;
|
|
|
- SymTab.FixPending(t); .) .
|
|
|
|
|
- VarIdents (. VAR n: SymTab.Name; .)
|
|
|
|
|
- = GetIdent<n> (. IF ~SymTab.EnterPending(n,
|
|
|
|
|
|
|
+ AST.SetChainType(h, t);
|
|
|
|
|
+ SymTab.FixPending(t);
|
|
|
|
|
+ n := h; .) .
|
|
|
|
|
+ VarIdents<VAR h: AST.Node> (. VAR nm: SymTab.Name; .)
|
|
|
|
|
+ = GetIdent<nm> (. IF ~SymTab.EnterPending(nm,
|
|
|
SymTab.KindVar)
|
|
SymTab.KindVar)
|
|
|
- THEN SemError(200) END; .)
|
|
|
|
|
|
|
+ THEN SemError(200) END;
|
|
|
|
|
+ h := AST.MkVar(nm,
|
|
|
|
|
+ SymTab.InvalidType); .)
|
|
|
{ ","
|
|
{ ","
|
|
|
- GetIdent<n> (. IF ~SymTab.EnterPending(n,
|
|
|
|
|
|
|
+ GetIdent<nm> (. IF ~SymTab.EnterPending(nm,
|
|
|
SymTab.KindVar)
|
|
SymTab.KindVar)
|
|
|
- THEN SemError(200) END; .) } .
|
|
|
|
|
- ProcDecl (. VAR m1, m2: SymTab.Name;
|
|
|
|
|
- rt: SymTab.TypeIndex; .)
|
|
|
|
|
- = "PROCEDURE"
|
|
|
|
|
|
|
+ THEN SemError(200) END;
|
|
|
|
|
+ h := AST.Append(h,
|
|
|
|
|
+ AST.MkVar(nm,
|
|
|
|
|
+ SymTab.InvalidType)); .) } .
|
|
|
|
|
+ ProcDecl<VAR n: AST.Node> (. VAR m1, m2: SymTab.Name;
|
|
|
|
|
+ rt, ret: SymTab.TypeIndex;
|
|
|
|
|
+ p, bd, bs: AST.Node; .)
|
|
|
|
|
+ = (. ret := SymTab.InvalidType;
|
|
|
|
|
+ p := NIL; .)
|
|
|
|
|
+ "PROCEDURE"
|
|
|
GetIdent<m1> (. IF ~SymTab.EnterProc(m1) THEN
|
|
GetIdent<m1> (. IF ~SymTab.EnterProc(m1) THEN
|
|
|
SemError(200) END;
|
|
SemError(200) END;
|
|
|
SymTab.OpenProcScope; .)
|
|
SymTab.OpenProcScope; .)
|
|
|
- [ FormalParams ]
|
|
|
|
|
|
|
+ [ FormalParams<p> ]
|
|
|
[ ":"
|
|
[ ":"
|
|
|
- QualIdent<rt> (. SymTab.SetProcRet(rt); .) ]
|
|
|
|
|
|
|
+ QualIdent<rt> (. ret := rt;
|
|
|
|
|
+ SymTab.SetProcRet(rt); .) ]
|
|
|
";"
|
|
";"
|
|
|
- Block
|
|
|
|
|
|
|
+ Block<bd, bs> (. n := AST.MkProc(m1, ret, p,
|
|
|
|
|
+ AST.MkBlock(bd, bs)); .)
|
|
|
GetIdent<m2> (. IF ~SymTab.Equal(m1, m2) THEN
|
|
GetIdent<m2> (. IF ~SymTab.Equal(m1, m2) THEN
|
|
|
SemError(202) END;
|
|
SemError(202) END;
|
|
|
SymTab.CloseProc; .) .
|
|
SymTab.CloseProc; .) .
|
|
|
- FormalParams
|
|
|
|
|
- = "("
|
|
|
|
|
- [ FPSection
|
|
|
|
|
- { ";"
|
|
|
|
|
- FPSection } ]
|
|
|
|
|
|
|
+ FormalParams<VAR p: AST.Node> (. VAR ps: AST.Node; .)
|
|
|
|
|
+ = "(" (. p := NIL; .)
|
|
|
|
|
+ [ FPSection<ps> (. p := AST.Append(p, ps); .)
|
|
|
|
|
+ { ";" FPSection<ps> (. p := AST.Append(p, ps); .) } ]
|
|
|
")" .
|
|
")" .
|
|
|
- FPSection (. VAR isV: BOOLEAN;
|
|
|
|
|
|
|
+ FPSection<VAR p: AST.Node> (. VAR isV: BOOLEAN;
|
|
|
t: SymTab.TypeIndex; .)
|
|
t: SymTab.TypeIndex; .)
|
|
|
= (. isV := FALSE; .)
|
|
= (. isV := FALSE; .)
|
|
|
[ "VAR" (. isV := TRUE; .) ]
|
|
[ "VAR" (. isV := TRUE; .) ]
|
|
|
- FPIdents<isV> ":"
|
|
|
|
|
|
|
+ FPIdents<isV, p> ":"
|
|
|
Type<t> (. IF SymTab.IsOpen(t) & ~isV THEN
|
|
Type<t> (. IF SymTab.IsOpen(t) & ~isV THEN
|
|
|
SemError(230) END;
|
|
SemError(230) END;
|
|
|
|
|
+ AST.SetChainType(p, t);
|
|
|
IF ~SymTab.FixParamPending(t) THEN
|
|
IF ~SymTab.FixParamPending(t) THEN
|
|
|
SemError(200) END; .) .
|
|
SemError(200) END; .) .
|
|
|
- FPIdents<isV: BOOLEAN> (. VAR n: SymTab.Name; .)
|
|
|
|
|
|
|
+ FPIdents<isV: BOOLEAN; VAR p: AST.Node>
|
|
|
|
|
+ (. VAR n: SymTab.Name; .)
|
|
|
= GetIdent<n> (. IF ~SymTab.EnterParamPending(n,
|
|
= GetIdent<n> (. IF ~SymTab.EnterParamPending(n,
|
|
|
isV) THEN
|
|
isV) THEN
|
|
|
- SemError(200) END; .)
|
|
|
|
|
|
|
+ SemError(200) END;
|
|
|
|
|
+ p := AST.MkParam(n,
|
|
|
|
|
+ SymTab.InvalidType,
|
|
|
|
|
+ isV); .)
|
|
|
{ ","
|
|
{ ","
|
|
|
GetIdent<n> (. IF ~SymTab.EnterParamPending(n,
|
|
GetIdent<n> (. IF ~SymTab.EnterParamPending(n,
|
|
|
isV) THEN
|
|
isV) THEN
|
|
|
- SemError(200) END; .) } .
|
|
|
|
|
- ModuleDecl (. VAR m1, m2: SymTab.Name; .)
|
|
|
|
|
|
|
+ SemError(200) END;
|
|
|
|
|
+ p := AST.Append(p,
|
|
|
|
|
+ AST.MkParam(n,
|
|
|
|
|
+ SymTab.InvalidType,
|
|
|
|
|
+ isV)); .) } .
|
|
|
|
|
+ ModuleDecl<VAR n: AST.Node> (. VAR m1, m2: SymTab.Name;
|
|
|
|
|
+ d, bd, bs: AST.Node;
|
|
|
|
|
+ im, en: AST.Node; .)
|
|
|
= "MODULE" (* local module, Wirth form *)
|
|
= "MODULE" (* local module, Wirth form *)
|
|
|
|
|
+ (. d := NIL; .)
|
|
|
GetIdent<m1> (. IF ~SymTab.EnterModule(m1) THEN
|
|
GetIdent<m1> (. IF ~SymTab.EnterModule(m1) THEN
|
|
|
SemError(200) END; .)
|
|
SemError(200) END; .)
|
|
|
[ Priority ]
|
|
[ Priority ]
|
|
|
";"
|
|
";"
|
|
|
- { Import }
|
|
|
|
|
- [ Export ]
|
|
|
|
|
- Block
|
|
|
|
|
|
|
+ { Import<im> (. d := AST.Append(d, im); .) }
|
|
|
|
|
+ [ Export<en> (. d := AST.Append(d, en); .) ]
|
|
|
|
|
+ Block<bd, bs> (. d := AST.Append(d, bd);
|
|
|
|
|
+ n := AST.MkModule(m1, d,
|
|
|
|
|
+ AST.MkBlock(NIL, bs)); .)
|
|
|
GetIdent<m2> (. IF ~SymTab.Equal(m1, m2) THEN
|
|
GetIdent<m2> (. IF ~SymTab.Equal(m1, m2) THEN
|
|
|
SemError(202) END;
|
|
SemError(202) END;
|
|
|
IF ~SymTab.ExitModule() THEN
|
|
IF ~SymTab.ExitModule() THEN
|
|
|
SemError(201) END; .) .
|
|
SemError(201) END; .) .
|
|
|
Priority (. VAR t: SymTab.TypeIndex;
|
|
Priority (. VAR t: SymTab.TypeIndex;
|
|
|
- vD: BOOLEAN; .)
|
|
|
|
|
|
|
+ vD: BOOLEAN;
|
|
|
|
|
+ en: AST.Node; .)
|
|
|
= "["
|
|
= "["
|
|
|
- Expr<t, vD>
|
|
|
|
|
|
|
+ Expr<t, vD, en>
|
|
|
"]" .
|
|
"]" .
|
|
|
- Export (. VAR n: SymTab.Name; .)
|
|
|
|
|
|
|
+ Export<VAR n: AST.Node> (. VAR nm: SymTab.Name;
|
|
|
|
|
+ h: AST.Node; .)
|
|
|
= "EXPORT"
|
|
= "EXPORT"
|
|
|
[ "QUALIFIED" ]
|
|
[ "QUALIFIED" ]
|
|
|
- GetIdent<n> (. IF ~SymTab.ModuleAddExp(n) THEN
|
|
|
|
|
- SemError(200) END; .)
|
|
|
|
|
|
|
+ GetIdent<nm> (. IF ~SymTab.ModuleAddExp(nm) THEN
|
|
|
|
|
+ SemError(200) END;
|
|
|
|
|
+ h := AST.MkImpName(nm); .)
|
|
|
{ ","
|
|
{ ","
|
|
|
- GetIdent<n> (. IF ~SymTab.ModuleAddExp(n) THEN
|
|
|
|
|
- SemError(200) END; .) }
|
|
|
|
|
- ";" .
|
|
|
|
|
|
|
+ GetIdent<nm> (. IF ~SymTab.ModuleAddExp(nm) THEN
|
|
|
|
|
+ SemError(200) END;
|
|
|
|
|
+ h := AST.Append(h,
|
|
|
|
|
+ AST.MkImpName(nm)); .) }
|
|
|
|
|
+ ";" (. n := AST.MkExport(h); .) .
|
|
|
Type<VAR t: SymTab.TypeIndex>
|
|
Type<VAR t: SymTab.TypeIndex>
|
|
|
(. VAR c: CARDINAL;
|
|
(. VAR c: CARDINAL;
|
|
|
- e, s: SymTab.TypeIndex; .)
|
|
|
|
|
|
|
+ e, s: SymTab.TypeIndex;
|
|
|
|
|
+ fh: AST.Node; .)
|
|
|
= BoundedBase<t>
|
|
= BoundedBase<t>
|
|
|
| "ARRAY" (* abbreviated form only (3.1);
|
|
| "ARRAY" (* abbreviated form only (3.1);
|
|
|
nested ARRAY OF ARRAY long form
|
|
nested ARRAY OF ARRAY long form
|
|
|
- flagged in step 3 sizing *)
|
|
|
|
|
|
|
+ flagged in step 4 sizing *)
|
|
|
(. c := 0; .)
|
|
(. c := 0; .)
|
|
|
[ IdxList<c> ]
|
|
[ IdxList<c> ]
|
|
|
"OF"
|
|
"OF"
|
|
|
Type<e> (. t := SymTab.WrapArray(e, c); .)
|
|
Type<e> (. t := SymTab.WrapArray(e, c); .)
|
|
|
| "RECORD" (. t := SymTab.NewRecord(); .)
|
|
| "RECORD" (. t := SymTab.NewRecord(); .)
|
|
|
- FieldSeq<t>
|
|
|
|
|
|
|
+ FieldSeq<t, fh>
|
|
|
"END"
|
|
"END"
|
|
|
| "SET"
|
|
| "SET"
|
|
|
"OF"
|
|
"OF"
|
|
@@ -219,10 +272,11 @@ PRODUCTIONS
|
|
|
Type<e> (. t := SymTab.NewPtr(e); .) .
|
|
Type<e> (. t := SymTab.NewPtr(e); .) .
|
|
|
BoundedBase<VAR t: SymTab.TypeIndex>
|
|
BoundedBase<VAR t: SymTab.TypeIndex>
|
|
|
(. VAR t1, t2: SymTab.TypeIndex;
|
|
(. VAR t1, t2: SymTab.TypeIndex;
|
|
|
- vD, vD2: BOOLEAN; .)
|
|
|
|
|
|
|
+ vD, vD2: BOOLEAN;
|
|
|
|
|
+ en: AST.Node; .)
|
|
|
= QualIdent<t>
|
|
= QualIdent<t>
|
|
|
[ "["
|
|
[ "["
|
|
|
- Expr<t1, vD> (. IF (t1 # SymTab.InvalidType)
|
|
|
|
|
|
|
+ Expr<t1, vD, en> (. IF (t1 # SymTab.InvalidType)
|
|
|
& (SymTab.ClassOf(t1) #
|
|
& (SymTab.ClassOf(t1) #
|
|
|
SymTab.ClInt)
|
|
SymTab.ClInt)
|
|
|
& (SymTab.ClassOf(t1) #
|
|
& (SymTab.ClassOf(t1) #
|
|
@@ -231,7 +285,7 @@ PRODUCTIONS
|
|
|
SymTab.ClEnum) THEN
|
|
SymTab.ClEnum) THEN
|
|
|
SemError(224) END; .)
|
|
SemError(224) END; .)
|
|
|
".."
|
|
".."
|
|
|
- Expr<t2, vD2> (. IF (t2 # SymTab.InvalidType)
|
|
|
|
|
|
|
+ Expr<t2, vD2, en> (. IF (t2 # SymTab.InvalidType)
|
|
|
& (SymTab.ClassOf(t2) #
|
|
& (SymTab.ClassOf(t2) #
|
|
|
SymTab.ClInt)
|
|
SymTab.ClInt)
|
|
|
& (SymTab.ClassOf(t2) #
|
|
& (SymTab.ClassOf(t2) #
|
|
@@ -241,7 +295,7 @@ PRODUCTIONS
|
|
|
SemError(224) END; .)
|
|
SemError(224) END; .)
|
|
|
"]" (. t := SymTab.NewSub(t1); .) ]
|
|
"]" (. t := SymTab.NewSub(t1); .) ]
|
|
|
| "["
|
|
| "["
|
|
|
- Expr<t1, vD> (. IF (t1 # SymTab.InvalidType)
|
|
|
|
|
|
|
+ Expr<t1, vD, en> (. IF (t1 # SymTab.InvalidType)
|
|
|
& (SymTab.ClassOf(t1) #
|
|
& (SymTab.ClassOf(t1) #
|
|
|
SymTab.ClInt)
|
|
SymTab.ClInt)
|
|
|
& (SymTab.ClassOf(t1) #
|
|
& (SymTab.ClassOf(t1) #
|
|
@@ -250,7 +304,7 @@ PRODUCTIONS
|
|
|
SymTab.ClEnum) THEN
|
|
SymTab.ClEnum) THEN
|
|
|
SemError(224) END; .)
|
|
SemError(224) END; .)
|
|
|
".."
|
|
".."
|
|
|
- Expr<t2, vD2> (. IF (t2 # SymTab.InvalidType)
|
|
|
|
|
|
|
+ Expr<t2, vD2, en> (. IF (t2 # SymTab.InvalidType)
|
|
|
& (SymTab.ClassOf(t2) #
|
|
& (SymTab.ClassOf(t2) #
|
|
|
SymTab.ClInt)
|
|
SymTab.ClInt)
|
|
|
& (SymTab.ClassOf(t2) #
|
|
& (SymTab.ClassOf(t2) #
|
|
@@ -281,19 +335,31 @@ PRODUCTIONS
|
|
|
INC(c); .) } .
|
|
INC(c); .) } .
|
|
|
IndexType<VAR t: SymTab.TypeIndex>
|
|
IndexType<VAR t: SymTab.TypeIndex>
|
|
|
= BoundedBase<t> .
|
|
= BoundedBase<t> .
|
|
|
- FieldSeq<rt: SymTab.TypeIndex>
|
|
|
|
|
- = Field<rt>
|
|
|
|
|
|
|
+ FieldSeq<rt: SymTab.TypeIndex; VAR h: AST.Node>
|
|
|
|
|
+ (. VAR fn: AST.Node; .)
|
|
|
|
|
+ = Field<rt, fn> (. h := fn; .)
|
|
|
{ ";"
|
|
{ ";"
|
|
|
- Field<rt> } .
|
|
|
|
|
- Field<rt: SymTab.TypeIndex> (. VAR et: SymTab.TypeIndex; .)
|
|
|
|
|
- = [ FieldIdents<rt> ":"
|
|
|
|
|
- Type<et> (. SymTab.FixPendingF(rt, et); .) ] .
|
|
|
|
|
- FieldIdents<rt: SymTab.TypeIndex> (. VAR n: SymTab.Name; .)
|
|
|
|
|
- = GetIdent<n> (. IF ~SymTab.FieldPending(rt, n)
|
|
|
|
|
- THEN SemError(200) END; .)
|
|
|
|
|
|
|
+ Field<rt, fn> (. h := AST.Append(h, fn); .) } .
|
|
|
|
|
+ Field<rt: SymTab.TypeIndex; VAR n: AST.Node>
|
|
|
|
|
+ (. VAR et: SymTab.TypeIndex;
|
|
|
|
|
+ h: AST.Node; .)
|
|
|
|
|
+ = (. n := NIL; .)
|
|
|
|
|
+ [ FieldIdents<rt, h> ":"
|
|
|
|
|
+ Type<et> (. AST.SetChainType(h, et);
|
|
|
|
|
+ SymTab.FixPendingF(rt, et);
|
|
|
|
|
+ n := h; .) ] .
|
|
|
|
|
+ FieldIdents<rt: SymTab.TypeIndex; VAR h: AST.Node>
|
|
|
|
|
+ (. VAR nm: SymTab.Name; .)
|
|
|
|
|
+ = GetIdent<nm> (. IF ~SymTab.FieldPending(rt, nm)
|
|
|
|
|
+ THEN SemError(200) END;
|
|
|
|
|
+ h := AST.MkMember(nm,
|
|
|
|
|
+ SymTab.InvalidType); .)
|
|
|
{ ","
|
|
{ ","
|
|
|
- GetIdent<n> (. IF ~SymTab.FieldPending(rt, n)
|
|
|
|
|
- THEN SemError(200) END; .) } .
|
|
|
|
|
|
|
+ GetIdent<nm> (. IF ~SymTab.FieldPending(rt, nm)
|
|
|
|
|
+ THEN SemError(200) END;
|
|
|
|
|
+ h := AST.Append(h,
|
|
|
|
|
+ AST.MkMember(nm,
|
|
|
|
|
+ SymTab.InvalidType)); .) } .
|
|
|
QualIdent<VAR t: SymTab.TypeIndex>
|
|
QualIdent<VAR t: SymTab.TypeIndex>
|
|
|
(. VAR n, m: SymTab.Name;
|
|
(. VAR n, m: SymTab.Name;
|
|
|
modHead: BOOLEAN; .)
|
|
modHead: BOOLEAN; .)
|
|
@@ -339,28 +405,31 @@ PRODUCTIONS
|
|
|
SemError(221);
|
|
SemError(221);
|
|
|
t := SymTab.InvalidType
|
|
t := SymTab.InvalidType
|
|
|
END; .) } .
|
|
END; .) } .
|
|
|
- StatSeq
|
|
|
|
|
- = Stat
|
|
|
|
|
|
|
+ StatSeq<VAR s: AST.Node> (. VAR st: AST.Node; .)
|
|
|
|
|
+ = Stat<st> (. s := st; .)
|
|
|
{ ";"
|
|
{ ";"
|
|
|
- Stat } .
|
|
|
|
|
- Stat
|
|
|
|
|
- = [ AssignOrCall
|
|
|
|
|
- | IfStat
|
|
|
|
|
- | WhileStat
|
|
|
|
|
- | RepeatStat
|
|
|
|
|
- | LoopStat
|
|
|
|
|
- | ForStat
|
|
|
|
|
- | ReturnStat
|
|
|
|
|
|
|
+ Stat<st> (. s := AST.Append(s, st); .) } .
|
|
|
|
|
+ Stat<VAR s: AST.Node>
|
|
|
|
|
+ = (. s := NIL; .)
|
|
|
|
|
+ [ AssignOrCall<s>
|
|
|
|
|
+ | IfStat<s>
|
|
|
|
|
+ | WhileStat<s>
|
|
|
|
|
+ | RepeatStat<s>
|
|
|
|
|
+ | LoopStat<s>
|
|
|
|
|
+ | ForStat<s>
|
|
|
|
|
+ | ReturnStat<s>
|
|
|
| "EXIT" (. IF ~SymTab.InLoop() THEN
|
|
| "EXIT" (. IF ~SymTab.InLoop() THEN
|
|
|
- SemError(230) END; .) ] .
|
|
|
|
|
- AssignOrCall (. VAR dt, et: SymTab.TypeIndex;
|
|
|
|
|
|
|
+ SemError(230) END;
|
|
|
|
|
+ s := AST.MkExit(); .) ] .
|
|
|
|
|
+ AssignOrCall<VAR s: AST.Node> (. VAR dt, et: SymTab.TypeIndex;
|
|
|
dk, pn: INTEGER;
|
|
dk, pn: INTEGER;
|
|
|
ev: BOOLEAN;
|
|
ev: BOOLEAN;
|
|
|
nn: CARDINAL;
|
|
nn: CARDINAL;
|
|
|
- hadP: BOOLEAN; .)
|
|
|
|
|
- = Designator<dt, dk, pn>
|
|
|
|
|
|
|
+ hadP: BOOLEAN;
|
|
|
|
|
+ dn, en, ah: AST.Node; .)
|
|
|
|
|
+ = Designator<dt, dk, pn, dn>
|
|
|
( ":="
|
|
( ":="
|
|
|
- Expr<et, ev> (. IF dt = SymTab.InvalidType THEN
|
|
|
|
|
|
|
+ Expr<et, ev, en> (. IF dt = SymTab.InvalidType THEN
|
|
|
(* cascade *)
|
|
(* cascade *)
|
|
|
ELSIF (dk # SymTab.KindVar)
|
|
ELSIF (dk # SymTab.KindVar)
|
|
|
& (dk # SymTab.KindParam)
|
|
& (dk # SymTab.KindParam)
|
|
@@ -369,8 +438,10 @@ PRODUCTIONS
|
|
|
SemError(210)
|
|
SemError(210)
|
|
|
ELSIF ~SymTab.Assignable(et,
|
|
ELSIF ~SymTab.Assignable(et,
|
|
|
dt) THEN
|
|
dt) THEN
|
|
|
- SemError(210) END; .)
|
|
|
|
|
|
|
+ SemError(210) END;
|
|
|
|
|
+ s := AST.MkAssign(dn, en); .)
|
|
|
| (. hadP := FALSE; nn := 0;
|
|
| (. hadP := FALSE; nn := 0;
|
|
|
|
|
+ ah := NIL;
|
|
|
IF dk = SymTab.KindProc THEN
|
|
IF dk = SymTab.KindProc THEN
|
|
|
SymTab.CallBeginNum(pn)
|
|
SymTab.CallBeginNum(pn)
|
|
|
ELSE
|
|
ELSE
|
|
@@ -379,15 +450,18 @@ PRODUCTIONS
|
|
|
IF (dk # SymTab.KindProc)
|
|
IF (dk # SymTab.KindProc)
|
|
|
& (dk # -1) THEN
|
|
& (dk # -1) THEN
|
|
|
SemError(233) END; .)
|
|
SemError(233) END; .)
|
|
|
- [ ActParams<nn> (. hadP := TRUE; .) ]
|
|
|
|
|
|
|
+ [ ActParams<ah, nn> (. hadP := TRUE; .) ]
|
|
|
(. IF ~SymTab.CallEndNum(nn) THEN
|
|
(. IF ~SymTab.CallEndNum(nn) THEN
|
|
|
- SemError(233) END; .) ) .
|
|
|
|
|
|
|
+ SemError(233) END;
|
|
|
|
|
+ s := AST.MkCall(dn, ah, pn); .) ) .
|
|
|
Designator<VAR t: SymTab.TypeIndex; VAR k: INTEGER;
|
|
Designator<VAR t: SymTab.TypeIndex; VAR k: INTEGER;
|
|
|
- VAR pn: INTEGER> (. VAR n, m: SymTab.Name;
|
|
|
|
|
|
|
+ VAR pn: INTEGER; VAR dn: AST.Node>
|
|
|
|
|
+ (. VAR n, m: SymTab.Name;
|
|
|
it, it2: SymTab.TypeIndex;
|
|
it, it2: SymTab.TypeIndex;
|
|
|
iv, iv2: BOOLEAN;
|
|
iv, iv2: BOOLEAN;
|
|
|
ek, sk, p2: INTEGER;
|
|
ek, sk, p2: INTEGER;
|
|
|
- modHead: BOOLEAN; .)
|
|
|
|
|
|
|
+ modHead: BOOLEAN;
|
|
|
|
|
+ en, en2, ih: AST.Node; .)
|
|
|
= GetIdent<n> (. modHead := FALSE;
|
|
= GetIdent<n> (. modHead := FALSE;
|
|
|
IF ~SymTab.Lookup(n) THEN
|
|
IF ~SymTab.Lookup(n) THEN
|
|
|
SemError(201);
|
|
SemError(201);
|
|
@@ -405,7 +479,8 @@ PRODUCTIONS
|
|
|
pn := SymTab.ProcNum(n)
|
|
pn := SymTab.ProcNum(n)
|
|
|
ELSE pn := -1
|
|
ELSE pn := -1
|
|
|
END
|
|
END
|
|
|
- END; .)
|
|
|
|
|
|
|
+ END;
|
|
|
|
|
+ dn := AST.MkName(n, t); .)
|
|
|
{ "." GetIdent<m> (. IF modHead THEN
|
|
{ "." GetIdent<m> (. IF modHead THEN
|
|
|
modHead := FALSE;
|
|
modHead := FALSE;
|
|
|
ek := SymTab.ExpKind(n, m);
|
|
ek := SymTab.ExpKind(n, m);
|
|
@@ -466,8 +541,9 @@ PRODUCTIONS
|
|
|
m);
|
|
m);
|
|
|
k := SymTab.KindField;
|
|
k := SymTab.KindField;
|
|
|
pn := -1
|
|
pn := -1
|
|
|
- END; .)
|
|
|
|
|
- | "[" Expr<it, iv> (. IF t = SymTab.InvalidType THEN
|
|
|
|
|
|
|
+ END;
|
|
|
|
|
+ dn := AST.MkField(dn, m, t); .)
|
|
|
|
|
+ | "[" Expr<it, iv, en> (. IF t = SymTab.InvalidType THEN
|
|
|
(* cascade *)
|
|
(* cascade *)
|
|
|
ELSIF SymTab.ClassOf(t) #
|
|
ELSIF SymTab.ClassOf(t) #
|
|
|
SymTab.ClArray THEN
|
|
SymTab.ClArray THEN
|
|
@@ -484,8 +560,9 @@ PRODUCTIONS
|
|
|
ELSE t := SymTab.ArrayElem(
|
|
ELSE t := SymTab.ArrayElem(
|
|
|
t);
|
|
t);
|
|
|
pn := -1
|
|
pn := -1
|
|
|
- END; .)
|
|
|
|
|
- { "," Expr<it2, iv2> (. IF t = SymTab.InvalidType THEN
|
|
|
|
|
|
|
+ END;
|
|
|
|
|
+ ih := en; .)
|
|
|
|
|
+ { "," Expr<it2, iv2, en2> (. IF t = SymTab.InvalidType THEN
|
|
|
(* cascade *)
|
|
(* cascade *)
|
|
|
ELSIF SymTab.ClassOf(t) #
|
|
ELSIF SymTab.ClassOf(t) #
|
|
|
SymTab.ClArray THEN
|
|
SymTab.ClArray THEN
|
|
@@ -498,8 +575,10 @@ PRODUCTIONS
|
|
|
it2) THEN
|
|
it2) THEN
|
|
|
SemError(218)
|
|
SemError(218)
|
|
|
ELSE t := SymTab.ArrayElem(
|
|
ELSE t := SymTab.ArrayElem(
|
|
|
- t) END; .) }
|
|
|
|
|
- "]"
|
|
|
|
|
|
|
+ t) END;
|
|
|
|
|
+ ih := AST.Append(ih, en2); .) }
|
|
|
|
|
+ "]" (. dn := AST.MkIndex(dn, ih,
|
|
|
|
|
+ t); .)
|
|
|
| "^" (. IF t = SymTab.InvalidType THEN
|
|
| "^" (. IF t = SymTab.InvalidType THEN
|
|
|
(* cascade *)
|
|
(* cascade *)
|
|
|
ELSIF SymTab.ClassOf(t) #
|
|
ELSIF SymTab.ClassOf(t) #
|
|
@@ -509,56 +588,76 @@ PRODUCTIONS
|
|
|
k := -1; pn := -1
|
|
k := -1; pn := -1
|
|
|
ELSE t := SymTab.PtrBase(t);
|
|
ELSE t := SymTab.PtrBase(t);
|
|
|
pn := -1
|
|
pn := -1
|
|
|
- END; .) } .
|
|
|
|
|
- ActParams<VAR n: CARDINAL> (. VAR at: SymTab.TypeIndex;
|
|
|
|
|
- av: BOOLEAN; .)
|
|
|
|
|
- = "(" (. n := 0; .)
|
|
|
|
|
- [ Expr<at, av> (. IF ~SymTab.CallActual(at,
|
|
|
|
|
|
|
+ END;
|
|
|
|
|
+ dn := AST.MkDeref(dn, t); .) } .
|
|
|
|
|
+ ActParams<VAR h: AST.Node; VAR n: CARDINAL>
|
|
|
|
|
+ (. VAR at: SymTab.TypeIndex;
|
|
|
|
|
+ av: BOOLEAN;
|
|
|
|
|
+ ae: AST.Node; .)
|
|
|
|
|
+ = "(" (. h := NIL; n := 0; .)
|
|
|
|
|
+ [ Expr<at, av, ae> (. IF ~SymTab.CallActual(at,
|
|
|
av) THEN
|
|
av) THEN
|
|
|
SemError(233) END;
|
|
SemError(233) END;
|
|
|
|
|
+ h := AST.Append(h, ae);
|
|
|
n := 1; .)
|
|
n := 1; .)
|
|
|
- { "," Expr<at, av> (. IF ~SymTab.CallActual(at,
|
|
|
|
|
|
|
+ { "," Expr<at, av, ae> (. IF ~SymTab.CallActual(at,
|
|
|
av) THEN
|
|
av) THEN
|
|
|
SemError(233) END;
|
|
SemError(233) END;
|
|
|
|
|
+ h := AST.Append(h, ae);
|
|
|
INC(n); .) } ]
|
|
INC(n); .) } ]
|
|
|
")" .
|
|
")" .
|
|
|
- IfStat (. VAR t: SymTab.TypeIndex;
|
|
|
|
|
- vD: BOOLEAN; .)
|
|
|
|
|
|
|
+ IfStat<VAR s: AST.Node> (. VAR t: SymTab.TypeIndex;
|
|
|
|
|
+ vD: BOOLEAN;
|
|
|
|
|
+ cn, th, el, p: AST.Node; .)
|
|
|
= "IF"
|
|
= "IF"
|
|
|
- Expr<t, vD> (. IF ~SymTab.BoolCheck(t) THEN
|
|
|
|
|
|
|
+ Expr<t, vD, cn> (. IF ~SymTab.BoolCheck(t) THEN
|
|
|
SemError(214) END; .)
|
|
SemError(214) END; .)
|
|
|
"THEN"
|
|
"THEN"
|
|
|
- StatSeq
|
|
|
|
|
|
|
+ StatSeq<th> (. s := AST.MkIf(cn, th, NIL); .)
|
|
|
{ "ELSIF"
|
|
{ "ELSIF"
|
|
|
- Expr<t, vD> (. IF ~SymTab.BoolCheck(t) THEN
|
|
|
|
|
|
|
+ Expr<t, vD, cn> (. IF ~SymTab.BoolCheck(t) THEN
|
|
|
SemError(214) END; .)
|
|
SemError(214) END; .)
|
|
|
"THEN"
|
|
"THEN"
|
|
|
- StatSeq }
|
|
|
|
|
|
|
+ StatSeq<th> (. th := AST.MkIf(cn, th, NIL);
|
|
|
|
|
+ p := s;
|
|
|
|
|
+ WHILE p^.extra # NIL DO
|
|
|
|
|
+ p := p^.extra
|
|
|
|
|
+ END;
|
|
|
|
|
+ p^.extra := th; .) }
|
|
|
[ "ELSE"
|
|
[ "ELSE"
|
|
|
- StatSeq ]
|
|
|
|
|
|
|
+ StatSeq<el> (. p := s;
|
|
|
|
|
+ WHILE p^.extra # NIL DO
|
|
|
|
|
+ p := p^.extra
|
|
|
|
|
+ END;
|
|
|
|
|
+ p^.extra := el; .) ]
|
|
|
"END" .
|
|
"END" .
|
|
|
- WhileStat (. VAR t: SymTab.TypeIndex;
|
|
|
|
|
- vD: BOOLEAN; .)
|
|
|
|
|
|
|
+ WhileStat<VAR s: AST.Node> (. VAR t: SymTab.TypeIndex;
|
|
|
|
|
+ vD: BOOLEAN;
|
|
|
|
|
+ cn, bd: AST.Node; .)
|
|
|
= "WHILE"
|
|
= "WHILE"
|
|
|
- Expr<t, vD> (. IF ~SymTab.BoolCheck(t) THEN
|
|
|
|
|
|
|
+ Expr<t, vD, cn> (. IF ~SymTab.BoolCheck(t) THEN
|
|
|
SemError(214) END; .)
|
|
SemError(214) END; .)
|
|
|
"DO"
|
|
"DO"
|
|
|
- StatSeq
|
|
|
|
|
|
|
+ StatSeq<bd> (. s := AST.MkWhile(cn, bd); .)
|
|
|
"END" .
|
|
"END" .
|
|
|
- RepeatStat (. VAR t: SymTab.TypeIndex;
|
|
|
|
|
- vD: BOOLEAN; .)
|
|
|
|
|
|
|
+ RepeatStat<VAR s: AST.Node> (. VAR t: SymTab.TypeIndex;
|
|
|
|
|
+ vD: BOOLEAN;
|
|
|
|
|
+ cn, bd: AST.Node; .)
|
|
|
= "REPEAT"
|
|
= "REPEAT"
|
|
|
- StatSeq
|
|
|
|
|
|
|
+ StatSeq<bd>
|
|
|
"UNTIL"
|
|
"UNTIL"
|
|
|
- Expr<t, vD> (. IF ~SymTab.BoolCheck(t) THEN
|
|
|
|
|
- SemError(214) END; .) .
|
|
|
|
|
- LoopStat
|
|
|
|
|
|
|
+ Expr<t, vD, cn> (. IF ~SymTab.BoolCheck(t) THEN
|
|
|
|
|
+ SemError(214) END;
|
|
|
|
|
+ s := AST.MkRepeat(bd, cn); .) .
|
|
|
|
|
+ LoopStat<VAR s: AST.Node> (. VAR bd: AST.Node; .)
|
|
|
= "LOOP" (. SymTab.LoopEnter; .)
|
|
= "LOOP" (. SymTab.LoopEnter; .)
|
|
|
- StatSeq
|
|
|
|
|
- "END" (. SymTab.LoopExit; .) .
|
|
|
|
|
- ForStat (. VAR n: SymTab.Name;
|
|
|
|
|
|
|
+ StatSeq<bd>
|
|
|
|
|
+ "END" (. SymTab.LoopExit;
|
|
|
|
|
+ s := AST.MkLoop(bd); .) .
|
|
|
|
|
+ ForStat<VAR s: AST.Node> (. VAR n: SymTab.Name;
|
|
|
lo, hi, by: SymTab.TypeIndex;
|
|
lo, hi, by: SymTab.TypeIndex;
|
|
|
- lv, lv2, lv3: BOOLEAN; .)
|
|
|
|
|
|
|
+ lv, lv2, lv3: BOOLEAN;
|
|
|
|
|
+ ln, hn, bn, bd: AST.Node; .)
|
|
|
= "FOR"
|
|
= "FOR"
|
|
|
GetIdent<n> (. IF ~SymTab.Lookup(n) THEN
|
|
GetIdent<n> (. IF ~SymTab.Lookup(n) THEN
|
|
|
SemError(201)
|
|
SemError(201)
|
|
@@ -577,35 +676,41 @@ PRODUCTIONS
|
|
|
SymTab.SymType(n)) THEN
|
|
SymTab.SymType(n)) THEN
|
|
|
SemError(220) END; .)
|
|
SemError(220) END; .)
|
|
|
":="
|
|
":="
|
|
|
- Expr<lo, lv> (. IF (lo # SymTab.InvalidType)
|
|
|
|
|
|
|
+ Expr<lo, lv, ln> (. IF (lo # SymTab.InvalidType)
|
|
|
& ~SymTab.IsIntFamily(lo) THEN
|
|
& ~SymTab.IsIntFamily(lo) THEN
|
|
|
SemError(220) END; .)
|
|
SemError(220) END; .)
|
|
|
"TO"
|
|
"TO"
|
|
|
- Expr<hi, lv2> (. IF (hi # SymTab.InvalidType)
|
|
|
|
|
|
|
+ Expr<hi, lv2, hn> (. IF (hi # SymTab.InvalidType)
|
|
|
& ~SymTab.IsIntFamily(hi) THEN
|
|
& ~SymTab.IsIntFamily(hi) THEN
|
|
|
- SemError(220) END; .)
|
|
|
|
|
|
|
+ SemError(220) END;
|
|
|
|
|
+ bn := NIL; .)
|
|
|
[ "BY"
|
|
[ "BY"
|
|
|
- Expr<by, lv3> (. IF (by # SymTab.InvalidType)
|
|
|
|
|
|
|
+ Expr<by, lv3, bn> (. IF (by # SymTab.InvalidType)
|
|
|
& ~SymTab.IsIntFamily(by) THEN
|
|
& ~SymTab.IsIntFamily(by) THEN
|
|
|
SemError(220) END; .) ]
|
|
SemError(220) END; .) ]
|
|
|
"DO"
|
|
"DO"
|
|
|
- StatSeq
|
|
|
|
|
|
|
+ StatSeq<bd> (. s := AST.MkFor(n, ln, hn, bn,
|
|
|
|
|
+ bd); .)
|
|
|
"END" .
|
|
"END" .
|
|
|
- ReturnStat (. VAR et: SymTab.TypeIndex;
|
|
|
|
|
- ev, hasE: BOOLEAN; .)
|
|
|
|
|
- = (. hasE := FALSE; .)
|
|
|
|
|
|
|
+ ReturnStat<VAR s: AST.Node> (. VAR et: SymTab.TypeIndex;
|
|
|
|
|
+ ev, hasE: BOOLEAN;
|
|
|
|
|
+ en, e0: AST.Node; .)
|
|
|
|
|
+ = (. hasE := FALSE; e0 := NIL; .)
|
|
|
"RETURN"
|
|
"RETURN"
|
|
|
- [ Expr<et, ev> (. hasE := TRUE; .) ]
|
|
|
|
|
|
|
+ [ Expr<et, ev, en> (. hasE := TRUE; e0 := en; .) ]
|
|
|
(. IF ~SymTab.InProc() THEN SemError(232)
|
|
(. IF ~SymTab.InProc() THEN SemError(232)
|
|
|
ELSIF SymTab.InFunction() & ~hasE THEN SemError(232)
|
|
ELSIF SymTab.InFunction() & ~hasE THEN SemError(232)
|
|
|
ELSIF ~SymTab.InFunction() & hasE THEN
|
|
ELSIF ~SymTab.InFunction() & hasE THEN
|
|
|
- SemError(232) END; .) .
|
|
|
|
|
- Expr<VAR t: SymTab.TypeIndex; VAR v: BOOLEAN>
|
|
|
|
|
|
|
+ SemError(232) END;
|
|
|
|
|
+ s := AST.MkReturn(e0); .) .
|
|
|
|
|
+ Expr<VAR t: SymTab.TypeIndex; VAR v: BOOLEAN;
|
|
|
|
|
+ VAR e: AST.Node>
|
|
|
(. VAR t2: SymTab.TypeIndex;
|
|
(. VAR t2: SymTab.TypeIndex;
|
|
|
v2: BOOLEAN;
|
|
v2: BOOLEAN;
|
|
|
- op: INTEGER; .)
|
|
|
|
|
- = SimExpr<t, v>
|
|
|
|
|
- [ Relation<op> SimExpr<t2, v2>
|
|
|
|
|
|
|
+ op: INTEGER;
|
|
|
|
|
+ e2: AST.Node; .)
|
|
|
|
|
+ = SimExpr<t, v, e>
|
|
|
|
|
+ [ Relation<op> SimExpr<t2, v2, e2>
|
|
|
(. v := FALSE;
|
|
(. v := FALSE;
|
|
|
IF op = SymTab.OpIn THEN
|
|
IF op = SymTab.OpIn THEN
|
|
|
IF SymTab.InCheck(t, t2) THEN
|
|
IF SymTab.InCheck(t, t2) THEN
|
|
@@ -615,7 +720,8 @@ PRODUCTIONS
|
|
|
IF SymTab.RelCheck(t, t2, op) THEN
|
|
IF SymTab.RelCheck(t, t2, op) THEN
|
|
|
t := SymTab.BoolType()
|
|
t := SymTab.BoolType()
|
|
|
ELSE SemError(213); t := SymTab.InvalidType END
|
|
ELSE SemError(213); t := SymTab.InvalidType END
|
|
|
- END; .) ] .
|
|
|
|
|
|
|
+ END;
|
|
|
|
|
+ e := AST.MkBin(op, e, e2, t); .) ] .
|
|
|
Relation<VAR op: INTEGER>
|
|
Relation<VAR op: INTEGER>
|
|
|
= "=" (. op := SymTab.OpEq; .)
|
|
= "=" (. op := SymTab.OpEq; .)
|
|
|
| "#" (. op := SymTab.OpNeq1; .)
|
|
| "#" (. op := SymTab.OpNeq1; .)
|
|
@@ -625,24 +731,30 @@ PRODUCTIONS
|
|
|
| ">" (. op := SymTab.OpGt; .)
|
|
| ">" (. op := SymTab.OpGt; .)
|
|
|
| ">=" (. op := SymTab.OpGe; .)
|
|
| ">=" (. op := SymTab.OpGe; .)
|
|
|
| "IN" (. op := SymTab.OpIn; .) .
|
|
| "IN" (. op := SymTab.OpIn; .) .
|
|
|
- SimExpr<VAR t: SymTab.TypeIndex; VAR v: BOOLEAN>
|
|
|
|
|
|
|
+ SimExpr<VAR t: SymTab.TypeIndex; VAR v: BOOLEAN;
|
|
|
|
|
+ VAR e: AST.Node>
|
|
|
(. VAR t2, res2: SymTab.TypeIndex;
|
|
(. VAR t2, res2: SymTab.TypeIndex;
|
|
|
v2: BOOLEAN;
|
|
v2: BOOLEAN;
|
|
|
- op: INTEGER; .)
|
|
|
|
|
- = ( "+" Term<t, v> (. IF ~SymTab.UnaryCheck(t,
|
|
|
|
|
|
|
+ op: INTEGER;
|
|
|
|
|
+ e2: AST.Node; .)
|
|
|
|
|
+ = ( "+" Term<t, v, e> (. IF ~SymTab.UnaryCheck(t,
|
|
|
res2) THEN
|
|
res2) THEN
|
|
|
SemError(211);
|
|
SemError(211);
|
|
|
t := SymTab.InvalidType
|
|
t := SymTab.InvalidType
|
|
|
ELSE t := res2 END;
|
|
ELSE t := res2 END;
|
|
|
- v := FALSE; .)
|
|
|
|
|
- | "-" Fact<t, v> (. IF ~SymTab.UnaryCheck(t,
|
|
|
|
|
|
|
+ v := FALSE;
|
|
|
|
|
+ e := AST.MkUn(AST.opPos,
|
|
|
|
|
+ e, t); .)
|
|
|
|
|
+ | "-" Fact<t, v, e> (. IF ~SymTab.UnaryCheck(t,
|
|
|
res2) THEN
|
|
res2) THEN
|
|
|
SemError(211);
|
|
SemError(211);
|
|
|
t := SymTab.InvalidType
|
|
t := SymTab.InvalidType
|
|
|
ELSE t := res2 END;
|
|
ELSE t := res2 END;
|
|
|
- v := FALSE; .)
|
|
|
|
|
- | Term<t, v> )
|
|
|
|
|
- { AddOp<op> Term<t2, v2>
|
|
|
|
|
|
|
+ v := FALSE;
|
|
|
|
|
+ e := AST.MkUn(AST.opNeg,
|
|
|
|
|
+ e, t); .)
|
|
|
|
|
+ | Term<t, v, e> )
|
|
|
|
|
+ { AddOp<op> Term<t2, v2, e2>
|
|
|
(. v := FALSE;
|
|
(. v := FALSE;
|
|
|
IF op = SymTab.OpOr THEN
|
|
IF op = SymTab.OpOr THEN
|
|
|
IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
|
|
IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
|
|
@@ -652,17 +764,20 @@ PRODUCTIONS
|
|
|
IF SymTab.ArithCheck(t, t2, FALSE, res2) THEN
|
|
IF SymTab.ArithCheck(t, t2, FALSE, res2) THEN
|
|
|
t := res2
|
|
t := res2
|
|
|
ELSE SemError(211); t := SymTab.InvalidType END
|
|
ELSE SemError(211); t := SymTab.InvalidType END
|
|
|
- END; .) } .
|
|
|
|
|
|
|
+ END;
|
|
|
|
|
+ e := AST.MkBin(op, e, e2, t); .) } .
|
|
|
AddOp<VAR op: INTEGER>
|
|
AddOp<VAR op: INTEGER>
|
|
|
= "+" (. op := SymTab.OpAdd; .)
|
|
= "+" (. op := SymTab.OpAdd; .)
|
|
|
| "-" (. op := SymTab.OpSub; .)
|
|
| "-" (. op := SymTab.OpSub; .)
|
|
|
| "OR" (. op := SymTab.OpOr; .) .
|
|
| "OR" (. op := SymTab.OpOr; .) .
|
|
|
- Term<VAR t: SymTab.TypeIndex; VAR v: BOOLEAN>
|
|
|
|
|
|
|
+ Term<VAR t: SymTab.TypeIndex; VAR v: BOOLEAN;
|
|
|
|
|
+ VAR e: AST.Node>
|
|
|
(. VAR t2, res2: SymTab.TypeIndex;
|
|
(. VAR t2, res2: SymTab.TypeIndex;
|
|
|
v2: BOOLEAN;
|
|
v2: BOOLEAN;
|
|
|
- op: INTEGER; .)
|
|
|
|
|
- = Fact<t, v>
|
|
|
|
|
- { MulOp<op> Fact<t2, v2>
|
|
|
|
|
|
|
+ op: INTEGER;
|
|
|
|
|
+ e2: AST.Node; .)
|
|
|
|
|
+ = Fact<t, v, e>
|
|
|
|
|
+ { MulOp<op> Fact<t2, v2, e2>
|
|
|
(. v := FALSE;
|
|
(. v := FALSE;
|
|
|
IF op = SymTab.OpAnd THEN
|
|
IF op = SymTab.OpAnd THEN
|
|
|
IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
|
|
IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
|
|
@@ -673,33 +788,45 @@ PRODUCTIONS
|
|
|
(op = SymTab.OpDiv) OR (op = SymTab.OpMod),
|
|
(op = SymTab.OpDiv) OR (op = SymTab.OpMod),
|
|
|
res2) THEN t := res2
|
|
res2) THEN t := res2
|
|
|
ELSE SemError(211); t := SymTab.InvalidType END
|
|
ELSE SemError(211); t := SymTab.InvalidType END
|
|
|
- END; .) } .
|
|
|
|
|
|
|
+ END;
|
|
|
|
|
+ e := AST.MkBin(op, e, e2, t); .) } .
|
|
|
MulOp<VAR op: INTEGER>
|
|
MulOp<VAR op: INTEGER>
|
|
|
= "*" (. op := SymTab.OpTimes; .)
|
|
= "*" (. op := SymTab.OpTimes; .)
|
|
|
| "/" (. op := SymTab.OpSlash; .)
|
|
| "/" (. op := SymTab.OpSlash; .)
|
|
|
| "DIV" (. op := SymTab.OpDiv; .)
|
|
| "DIV" (. op := SymTab.OpDiv; .)
|
|
|
| "MOD" (. op := SymTab.OpMod; .)
|
|
| "MOD" (. op := SymTab.OpMod; .)
|
|
|
| "AND" (. op := SymTab.OpAnd; .) .
|
|
| "AND" (. op := SymTab.OpAnd; .) .
|
|
|
- Fact<VAR t: SymTab.TypeIndex; VAR v: BOOLEAN>
|
|
|
|
|
|
|
+ Fact<VAR t: SymTab.TypeIndex; VAR v: BOOLEAN;
|
|
|
|
|
+ VAR e: AST.Node>
|
|
|
(. VAR s: ARRAY [0 .. 255] OF CHAR;
|
|
(. VAR s: ARRAY [0 .. 255] OF CHAR;
|
|
|
t2, et, dt: SymTab.TypeIndex;
|
|
t2, et, dt: SymTab.TypeIndex;
|
|
|
dk, pn: INTEGER;
|
|
dk, pn: INTEGER;
|
|
|
nn: CARDINAL;
|
|
nn: CARDINAL;
|
|
|
hadP, ce, pushed: BOOLEAN;
|
|
hadP, ce, pushed: BOOLEAN;
|
|
|
- ev, v2: BOOLEAN; .)
|
|
|
|
|
|
|
+ ev, v2: BOOLEAN;
|
|
|
|
|
+ dn, ah, en: AST.Node;
|
|
|
|
|
+ iv: INTEGER;
|
|
|
|
|
+ ok: BOOLEAN; .)
|
|
|
= integer (. LexString(s);
|
|
= integer (. LexString(s);
|
|
|
t := SymTab.IntType();
|
|
t := SymTab.IntType();
|
|
|
- v := FALSE; .)
|
|
|
|
|
|
|
+ v := FALSE;
|
|
|
|
|
+ ok := AST.ParseInt(s, iv);
|
|
|
|
|
+ IF ~ok THEN iv := 0 END;
|
|
|
|
|
+ e := AST.MkInt(iv, t); .)
|
|
|
| real (. LexString(s);
|
|
| real (. LexString(s);
|
|
|
t := SymTab.RealType();
|
|
t := SymTab.RealType();
|
|
|
- v := FALSE; .)
|
|
|
|
|
|
|
+ v := FALSE;
|
|
|
|
|
+ e := AST.MkReal(s, t); .)
|
|
|
| string (. LexString(s);
|
|
| string (. LexString(s);
|
|
|
IF SymTab.StrLen(s) <= 3 THEN
|
|
IF SymTab.StrLen(s) <= 3 THEN
|
|
|
- t := SymTab.CharType()
|
|
|
|
|
- ELSE t := SymTab.NewStr()
|
|
|
|
|
|
|
+ t := SymTab.CharType();
|
|
|
|
|
+ e := AST.MkChar(
|
|
|
|
|
+ ORD(s[1]), t)
|
|
|
|
|
+ ELSE t := SymTab.NewStr();
|
|
|
|
|
+ e := AST.MkStr(s, t)
|
|
|
END;
|
|
END;
|
|
|
v := FALSE; .)
|
|
v := FALSE; .)
|
|
|
- | Designator<dt, dk, pn> (. hadP := FALSE; nn := 0;
|
|
|
|
|
|
|
+ | Designator<dt, dk, pn, dn> (. hadP := FALSE; nn := 0;
|
|
|
IF dk = SymTab.KindProc THEN
|
|
IF dk = SymTab.KindProc THEN
|
|
|
SymTab.CallBeginNum(pn);
|
|
SymTab.CallBeginNum(pn);
|
|
|
pushed := TRUE
|
|
pushed := TRUE
|
|
@@ -709,7 +836,7 @@ PRODUCTIONS
|
|
|
SymTab.CallBeginNum(-1);
|
|
SymTab.CallBeginNum(-1);
|
|
|
pushed := TRUE
|
|
pushed := TRUE
|
|
|
END; .)
|
|
END; .)
|
|
|
- ActParams<nn> (. hadP := TRUE; .) ]
|
|
|
|
|
|
|
+ ActParams<ah, nn> (. hadP := TRUE; .) ]
|
|
|
(. IF pushed THEN
|
|
(. IF pushed THEN
|
|
|
ce := SymTab.CallEndNum(nn)
|
|
ce := SymTab.CallEndNum(nn)
|
|
|
END;
|
|
END;
|
|
@@ -728,12 +855,15 @@ PRODUCTIONS
|
|
|
t := SymTab.InvalidType
|
|
t := SymTab.InvalidType
|
|
|
ELSE t :=
|
|
ELSE t :=
|
|
|
SymTab.ProcRetByNum(pn)
|
|
SymTab.ProcRetByNum(pn)
|
|
|
- END
|
|
|
|
|
|
|
+ END;
|
|
|
|
|
+ e := AST.MkCallExpr(dn, ah,
|
|
|
|
|
+ pn, t)
|
|
|
ELSE
|
|
ELSE
|
|
|
IF dk = SymTab.KindProc THEN
|
|
IF dk = SymTab.KindProc THEN
|
|
|
SemError(233);
|
|
SemError(233);
|
|
|
t := SymTab.InvalidType;
|
|
t := SymTab.InvalidType;
|
|
|
- v := FALSE
|
|
|
|
|
|
|
+ v := FALSE;
|
|
|
|
|
+ e := AST.MkName("?", t)
|
|
|
ELSE
|
|
ELSE
|
|
|
t := dt;
|
|
t := dt;
|
|
|
v := (dt #
|
|
v := (dt #
|
|
@@ -745,13 +875,17 @@ PRODUCTIONS
|
|
|
OR (dk =
|
|
OR (dk =
|
|
|
SymTab.KindVarPar)
|
|
SymTab.KindVarPar)
|
|
|
OR (dk =
|
|
OR (dk =
|
|
|
- SymTab.KindField))
|
|
|
|
|
|
|
+ SymTab.KindField));
|
|
|
|
|
+ e := dn
|
|
|
END
|
|
END
|
|
|
END; .)
|
|
END; .)
|
|
|
- | "(" Expr<et, ev> ")" (. t := et; v := FALSE; .)
|
|
|
|
|
- | "NOT" Fact<t2, v2> (. IF SymTab.BoolCheck(t2) THEN
|
|
|
|
|
|
|
+ | "(" Expr<et, ev, en> ")" (. t := et; v := FALSE;
|
|
|
|
|
+ e := en; .)
|
|
|
|
|
+ | "NOT" Fact<t2, v2, en> (. IF SymTab.BoolCheck(t2) THEN
|
|
|
t := SymTab.BoolType()
|
|
t := SymTab.BoolType()
|
|
|
ELSE SemError(212);
|
|
ELSE SemError(212);
|
|
|
t := SymTab.InvalidType END;
|
|
t := SymTab.InvalidType END;
|
|
|
- v := FALSE; .) .
|
|
|
|
|
|
|
+ v := FALSE;
|
|
|
|
|
+ e := AST.MkUn(AST.opNot, en,
|
|
|
|
|
+ t); .) .
|
|
|
END M2comp.
|
|
END M2comp.
|