|
@@ -100,6 +100,7 @@ PRODUCTIONS
|
|
|
";"
|
|
";"
|
|
|
{ Import }
|
|
{ Import }
|
|
|
{ ConstBlock | TypeBlock<TRUE> | VarBlock
|
|
{ ConstBlock | TypeBlock<TRUE> | VarBlock
|
|
|
|
|
+ | ConstDecl ";" (. (* manifest const, no CONST *) .)
|
|
|
| ProcHeading<pn> ";" (. SymTab.CloseProc; .)
|
|
| ProcHeading<pn> ";" (. SymTab.CloseProc; .)
|
|
|
| ClassItem ";" }
|
|
| ClassItem ";" }
|
|
|
"END"
|
|
"END"
|
|
@@ -140,10 +141,12 @@ PRODUCTIONS
|
|
|
"END"
|
|
"END"
|
|
|
GetIdent<m2> (. IF ~SymTab.Equal(m1, m2) THEN
|
|
GetIdent<m2> (. IF ~SymTab.Equal(m1, m2) THEN
|
|
|
SemError(202) END; .)
|
|
SemError(202) END; .)
|
|
|
- (. QbeGen.EndModule;
|
|
|
|
|
|
|
+ (. QbeGen.EndModule(m1);
|
|
|
SymTab.PrintTable; .) .
|
|
SymTab.PrintTable; .) .
|
|
|
DeclSeq
|
|
DeclSeq
|
|
|
- = { ConstBlock | TypeBlock<FALSE> | VarBlock | [ "INLINE" ] ProcDecl ";"
|
|
|
|
|
|
|
+ = { ConstBlock | TypeBlock<FALSE> | VarBlock
|
|
|
|
|
+ | ConstDecl ";" (. (* manifest const, no CONST *) .)
|
|
|
|
|
+ | [ "INLINE" ] ProcDecl ";"
|
|
|
| NestedModule ";" | ClassItem ";"
|
|
| NestedModule ";" | ClassItem ";"
|
|
|
| "LABEL" LabelList ";" } .
|
|
| "LABEL" LabelList ";" } .
|
|
|
LabelList (. VAR nm: SymTab.Name; .)
|
|
LabelList (. VAR nm: SymTab.Name; .)
|
|
@@ -288,7 +291,7 @@ ArrayType<VAR t: SymTab.TypeIndex> (. VAR e: SymTab.TypeIndex;
|
|
|
( "[" Bound { "," Bound } "]" (. t := SymTab.InvalidType; .)
|
|
( "[" Bound { "," Bound } "]" (. t := SymTab.InvalidType; .)
|
|
|
| Bound (. t := SymTab.InvalidType; .)
|
|
| Bound (. t := SymTab.InvalidType; .)
|
|
|
| (. t := SymTab.InvalidType; .) )
|
|
| (. t := SymTab.InvalidType; .) )
|
|
|
- "OF" Type<e> (. t := SymTab.NewArray(e);
|
|
|
|
|
|
|
+ "OF" Type<e> (. t := SymTab.NewOpenArray(e);
|
|
|
SemError(230); .) .
|
|
SemError(230); .) .
|
|
|
Bound (. VAR t: SymTab.TypeIndex;
|
|
Bound (. VAR t: SymTab.TypeIndex;
|
|
|
q: QbeGen.QVal; .)
|
|
q: QbeGen.QVal; .)
|
|
@@ -310,8 +313,10 @@ ArrayType<VAR t: SymTab.TypeIndex> (. VAR e: SymTab.TypeIndex;
|
|
|
FieldList<rec: SymTab.TypeIndex> (. VAR tag: SymTab.Name;
|
|
FieldList<rec: SymTab.TypeIndex> (. VAR tag: SymTab.Name;
|
|
|
ti: SymTab.TypeIndex; .)
|
|
ti: SymTab.TypeIndex; .)
|
|
|
= "CASE" (. SemError(230); .)
|
|
= "CASE" (. SemError(230); .)
|
|
|
- [ GetIdent<tag> ":"
|
|
|
|
|
- ] Type<ti>
|
|
|
|
|
|
|
+ ( GetIdent<tag> ":" (. (* named selector *) .)
|
|
|
|
|
+ | ":" (. (* anonymous selector *) .)
|
|
|
|
|
+ | (. (* no selector *) .) )
|
|
|
|
|
+ Type<ti>
|
|
|
"OF" VariantList<rec>
|
|
"OF" VariantList<rec>
|
|
|
"END"
|
|
"END"
|
|
|
| FieldIdents<rec> .
|
|
| FieldIdents<rec> .
|
|
@@ -323,7 +328,7 @@ ArrayType<VAR t: SymTab.TypeIndex> (. VAR e: SymTab.TypeIndex;
|
|
|
THEN SemError(200) END; .) }
|
|
THEN SemError(200) END; .) }
|
|
|
":" Type<t> (. SymTab.FixPendingF(rec, t); .) .
|
|
":" Type<t> (. SymTab.FixPendingF(rec, t); .) .
|
|
|
VariantList<rec: SymTab.TypeIndex>
|
|
VariantList<rec: SymTab.TypeIndex>
|
|
|
- = [ "|" ] Variant<rec> { "|" Variant<rec> }
|
|
|
|
|
|
|
+ = [ "|" ] Variant<rec> { "|" [ Variant<rec> ] }
|
|
|
[ "ELSE" FieldListSequence<rec> ] .
|
|
[ "ELSE" FieldListSequence<rec> ] .
|
|
|
Variant<rec: SymTab.TypeIndex>
|
|
Variant<rec: SymTab.TypeIndex>
|
|
|
= VariantLabels ":" (. SymTab.PushScope; .)
|
|
= VariantLabels ":" (. SymTab.PushScope; .)
|
|
@@ -527,7 +532,7 @@ ClassRest (. VAR cn, m2, pn, q: SymTab.Name;
|
|
|
QbeGen.DeclVar(nm, t);
|
|
QbeGen.DeclVar(nm, t);
|
|
|
INC(i)
|
|
INC(i)
|
|
|
END;
|
|
END;
|
|
|
- SymTab.FixPending(t); .) .
|
|
|
|
|
|
|
+ IF NOT SymTab.FixPending(t) THEN END; .) .
|
|
|
VarIdents (. VAR n: SymTab.Name;
|
|
VarIdents (. VAR n: SymTab.Name;
|
|
|
t: SymTab.TypeIndex;
|
|
t: SymTab.TypeIndex;
|
|
|
q: QbeGen.QVal; .)
|
|
q: QbeGen.QVal; .)
|
|
@@ -561,14 +566,14 @@ VarIdents (. VAR n: SymTab.Name;
|
|
|
SemError(200) END
|
|
SemError(200) END
|
|
|
END; .)
|
|
END; .)
|
|
|
[ FormalParams ]
|
|
[ FormalParams ]
|
|
|
- [ ":" TypeIdent2<t> (. SymTab.SetProcRes(t); .) ] .
|
|
|
|
|
|
|
+ [ ":" TypeIdent2<t> (. IF NOT SymTab.SetProcRes(t) THEN END; .) ] .
|
|
|
FormalParams
|
|
FormalParams
|
|
|
= "(" [ ParamSection { ";" ParamSection } ] ")" .
|
|
= "(" [ ParamSection { ";" ParamSection } ] ")" .
|
|
|
ParamSection (. VAR t: SymTab.TypeIndex;
|
|
ParamSection (. VAR t: SymTab.TypeIndex;
|
|
|
isV: BOOLEAN; .)
|
|
isV: BOOLEAN; .)
|
|
|
= (. isV := FALSE; .)
|
|
= (. isV := FALSE; .)
|
|
|
[ "VAR" (. isV := TRUE; .) ]
|
|
[ "VAR" (. isV := TRUE; .) ]
|
|
|
- ParIdents<isV> ":" Type<t> (. SymTab.FixPending(t); .) .
|
|
|
|
|
|
|
+ ParIdents<isV> ":" Type<t> (. IF NOT SymTab.FixPending(t) THEN END; .) .
|
|
|
ProcDecl (. VAR pn, assem: SymTab.Name;
|
|
ProcDecl (. VAR pn, assem: SymTab.Name;
|
|
|
at: SymTab.TypeIndex;
|
|
at: SymTab.TypeIndex;
|
|
|
ak: INTEGER;
|
|
ak: INTEGER;
|