|
@@ -199,7 +199,9 @@ PRODUCTIONS
|
|
|
Opaque "TYPE T;" needs isDef (definition units); elsewhere 231.
|
|
Opaque "TYPE T;" needs isDef (definition units); elsewhere 231.
|
|
|
Composite forms (ARRAY/RECORD/SET/POINTER) arrive with step 3. *)
|
|
Composite forms (ARRAY/RECORD/SET/POINTER) arrive with step 3. *)
|
|
|
TypeBlock<isDef: BOOLEAN>
|
|
TypeBlock<isDef: BOOLEAN>
|
|
|
- = "TYPE" { TypeItem<isDef> ";" | ClassItem ";" } .
|
|
|
|
|
|
|
+ = "TYPE" (. SymTab.BeginTypeBlock; .)
|
|
|
|
|
+ { TypeItem<isDef> ";" | ClassItem ";" }
|
|
|
|
|
+ (. SymTab.EndTypeBlock; .) .
|
|
|
TypeItem<isDef: BOOLEAN> (. VAR n: SymTab.Name;
|
|
TypeItem<isDef: BOOLEAN> (. VAR n: SymTab.Name;
|
|
|
t, op: SymTab.TypeIndex; .)
|
|
t, op: SymTab.TypeIndex; .)
|
|
|
= GetIdent<n> (. op := SymTab.OpaqueBase(n);
|
|
= GetIdent<n> (. op := SymTab.OpaqueBase(n);
|
|
@@ -303,7 +305,7 @@ PRODUCTIONS
|
|
|
offsets static and declaration-ordered. *)
|
|
offsets static and declaration-ordered. *)
|
|
|
RecordType<VAR t: SymTab.TypeIndex> (. VAR t2: SymTab.TypeIndex; .)
|
|
RecordType<VAR t: SymTab.TypeIndex> (. VAR t2: SymTab.TypeIndex; .)
|
|
|
= "RECORD" (. t := SymTab.NewRecord(); .)
|
|
= "RECORD" (. t := SymTab.NewRecord(); .)
|
|
|
- [ RecField<t> { ";" RecField<t> } ]
|
|
|
|
|
|
|
+ [ RecField<t> { ";" [ RecField<t> ] } ]
|
|
|
"END" .
|
|
"END" .
|
|
|
RecField<rec: SymTab.TypeIndex> (. VAR n: SymTab.Name;
|
|
RecField<rec: SymTab.TypeIndex> (. VAR n: SymTab.Name;
|
|
|
t2: SymTab.TypeIndex; .)
|
|
t2: SymTab.TypeIndex; .)
|
|
@@ -315,19 +317,39 @@ PRODUCTIONS
|
|
|
{ "," GetIdent<n> (. IF NOT SymTab.FieldPending(rec,
|
|
{ "," GetIdent<n> (. IF NOT SymTab.FieldPending(rec,
|
|
|
n) THEN
|
|
n) THEN
|
|
|
SemError(200) END; .) } .
|
|
SemError(200) END; .) } .
|
|
|
- TypeIdent<VAR t: SymTab.TypeIndex> (. VAR n: SymTab.Name;
|
|
|
|
|
- k: INTEGER; .)
|
|
|
|
|
- = GetIdent<n> (. IF NOT SymTab.Lookup(n) THEN
|
|
|
|
|
- SemError(201);
|
|
|
|
|
- t := SymTab.InvalidType
|
|
|
|
|
|
|
+ TypeIdent<VAR t: SymTab.TypeIndex> (. VAR n, qid: SymTab.Name;
|
|
|
|
|
+ k: INTEGER;
|
|
|
|
|
+ dotted: BOOLEAN; .)
|
|
|
|
|
+ = GetIdent<n> (. dotted := FALSE;
|
|
|
|
|
+ IF NOT SymTab.Lookup(n) THEN
|
|
|
|
|
+ k := -1;
|
|
|
|
|
+ t := SymTab.ForwardType(n);
|
|
|
|
|
+ IF t = SymTab.InvalidType THEN
|
|
|
|
|
+ SemError(201)
|
|
|
|
|
+ END
|
|
|
ELSE k := SymTab.SymKind(n);
|
|
ELSE k := SymTab.SymKind(n);
|
|
|
IF (k = SymTab.KindType)
|
|
IF (k = SymTab.KindType)
|
|
|
OR (k = SymTab.KindPredef) THEN
|
|
OR (k = SymTab.KindPredef) THEN
|
|
|
t := SymTab.SymType(n)
|
|
t := SymTab.SymType(n)
|
|
|
- ELSIF k = SymTab.KindImport THEN
|
|
|
|
|
- t := SymTab.InvalidType
|
|
|
|
|
- ELSE SemError(221);
|
|
|
|
|
- t := SymTab.InvalidType
|
|
|
|
|
|
|
+ ELSE t := SymTab.InvalidType
|
|
|
|
|
+ END
|
|
|
|
|
+ END; .)
|
|
|
|
|
+ [ "." GetIdent<qid> (. dotted := TRUE;
|
|
|
|
|
+ IF k = SymTab.KindModule THEN
|
|
|
|
|
+ t := SymTab.QualType(n, qid);
|
|
|
|
|
+ IF t = SymTab.InvalidType THEN
|
|
|
|
|
+ SemError(201)
|
|
|
|
|
+ END
|
|
|
|
|
+ ELSE SemError(221);
|
|
|
|
|
+ t := SymTab.InvalidType
|
|
|
|
|
+ END; .) ]
|
|
|
|
|
+ (. IF NOT dotted THEN
|
|
|
|
|
+ IF (k = SymTab.KindModule)
|
|
|
|
|
+ OR ((k # SymTab.KindType)
|
|
|
|
|
+ AND (k # SymTab.KindPredef)
|
|
|
|
|
+ AND (k # SymTab.KindImport)
|
|
|
|
|
+ AND (k # -1)) THEN
|
|
|
|
|
+ SemError(221)
|
|
|
END
|
|
END
|
|
|
END; .) .
|
|
END; .) .
|
|
|
Subrange<VAR t: SymTab.TypeIndex> (. VAR tlo, thi: SymTab.TypeIndex;
|
|
Subrange<VAR t: SymTab.TypeIndex> (. VAR tlo, thi: SymTab.TypeIndex;
|
|
@@ -486,6 +508,7 @@ PRODUCTIONS
|
|
|
SemError(230)
|
|
SemError(230)
|
|
|
ELSIF NOT QbeGen.IsImm(qv) THEN
|
|
ELSIF NOT QbeGen.IsImm(qv) THEN
|
|
|
SemError(230) END;
|
|
SemError(230) END;
|
|
|
|
|
+ SymTab.SetSymVal(n, qv);
|
|
|
QbeGen.DeclConst(n, qv, t); .) .
|
|
QbeGen.DeclConst(n, qv, t); .) .
|
|
|
VarBlock
|
|
VarBlock
|
|
|
= "VAR" { VarDecl ";" } .
|
|
= "VAR" { VarDecl ";" } .
|
|
@@ -1226,7 +1249,7 @@ PRODUCTIONS
|
|
|
lo, hi: INTEGER;
|
|
lo, hi: INTEGER;
|
|
|
fo: INTEGER;
|
|
fo: INTEGER;
|
|
|
isOpen: BOOLEAN;
|
|
isOpen: BOOLEAN;
|
|
|
- qb: QbeGen.QVal; .)
|
|
|
|
|
|
|
+ qb, cv: QbeGen.QVal; .)
|
|
|
= GetIdent<n> (. QbeGen.CopyOp(n, qn);
|
|
= GetIdent<n> (. QbeGen.CopyOp(n, qn);
|
|
|
sfx := FALSE;
|
|
sfx := FALSE;
|
|
|
IF NOT SymTab.Lookup(n) THEN
|
|
IF NOT SymTab.Lookup(n) THEN
|
|
@@ -1263,6 +1286,13 @@ PRODUCTIONS
|
|
|
= SymTab.ClNil)) THEN
|
|
= SymTab.ClNil)) THEN
|
|
|
IF cls = SymTab.ClNil THEN
|
|
IF cls = SymTab.ClNil THEN
|
|
|
QbeGen.CopyOp("0", q)
|
|
QbeGen.CopyOp("0", q)
|
|
|
|
|
+ ELSIF ((cls
|
|
|
|
|
+ = SymTab.ClInt)
|
|
|
|
|
+ OR (cls
|
|
|
|
|
+ = SymTab.ClChar))
|
|
|
|
|
+ AND SymTab.GetSymVal(n, cv)
|
|
|
|
|
+ AND QbeGen.IsImm(cv) THEN
|
|
|
|
|
+ QbeGen.CopyOp(cv, q)
|
|
|
ELSE
|
|
ELSE
|
|
|
QbeGen.LoadVar(n,
|
|
QbeGen.LoadVar(n,
|
|
|
cls = SymTab.ClReal,
|
|
cls = SymTab.ClReal,
|
|
@@ -1549,8 +1579,10 @@ PRODUCTIONS
|
|
|
(. VAR t2, res2, lt, rt:
|
|
(. VAR t2, res2, lt, rt:
|
|
|
SymTab.TypeIndex;
|
|
SymTab.TypeIndex;
|
|
|
op: INTEGER;
|
|
op: INTEGER;
|
|
|
- q2, qt, wq: QbeGen.QVal;
|
|
|
|
|
- neg, isR, isL: BOOLEAN;
|
|
|
|
|
|
|
+ q2, qt, wq, qf:
|
|
|
|
|
+ QbeGen.QVal;
|
|
|
|
|
+ neg, isR, isL, folded:
|
|
|
|
|
+ BOOLEAN;
|
|
|
lw, rw, mw: CARDINAL; .)
|
|
lw, rw, mw: CARDINAL; .)
|
|
|
= (. neg := FALSE; .)
|
|
= (. neg := FALSE; .)
|
|
|
[ "+" | "-" (. neg := TRUE; .) ]
|
|
[ "+" | "-" (. neg := TRUE; .) ]
|
|
@@ -1597,6 +1629,17 @@ PRODUCTIONS
|
|
|
IF t # SymTab.InvalidType THEN
|
|
IF t # SymTab.InvalidType THEN
|
|
|
isL := SymTab.IsLongFamily(t);
|
|
isL := SymTab.IsLongFamily(t);
|
|
|
isR := SymTab.ClassOf(t) = SymTab.ClReal;
|
|
isR := SymTab.ClassOf(t) = SymTab.ClReal;
|
|
|
|
|
+ folded := FALSE;
|
|
|
|
|
+ IF (NOT isL) AND (NOT isR)
|
|
|
|
|
+ AND QbeGen.IsImm(q) AND QbeGen.IsImm(q2) THEN
|
|
|
|
|
+ IF op = SymTab.OpAdd THEN
|
|
|
|
|
+ folded := QbeGen.Fold2(0, q, q2, qf)
|
|
|
|
|
+ ELSE
|
|
|
|
|
+ folded := QbeGen.Fold2(1, q, q2, qf)
|
|
|
|
|
+ END
|
|
|
|
|
+ END;
|
|
|
|
|
+ IF folded THEN QbeGen.CopyOp(qf, q)
|
|
|
|
|
+ ELSE
|
|
|
IF isL THEN
|
|
IF isL THEN
|
|
|
IF SymTab.IsIntFamily(lt) THEN
|
|
IF SymTab.IsIntFamily(lt) THEN
|
|
|
QbeGen.WidenLong(q, wq); QbeGen.CopyOp(wq, q)
|
|
QbeGen.WidenLong(q, wq); QbeGen.CopyOp(wq, q)
|
|
@@ -1619,6 +1662,7 @@ PRODUCTIONS
|
|
|
END
|
|
END
|
|
|
END;
|
|
END;
|
|
|
QbeGen.CopyOp(qt, q)
|
|
QbeGen.CopyOp(qt, q)
|
|
|
|
|
+ END
|
|
|
ELSE QbeGen.CopyOp("0", q)
|
|
ELSE QbeGen.CopyOp("0", q)
|
|
|
END
|
|
END
|
|
|
END; .) } .
|
|
END; .) } .
|
|
@@ -1630,8 +1674,9 @@ PRODUCTIONS
|
|
|
(. VAR t2, res2, lt, rt:
|
|
(. VAR t2, res2, lt, rt:
|
|
|
SymTab.TypeIndex;
|
|
SymTab.TypeIndex;
|
|
|
op: INTEGER;
|
|
op: INTEGER;
|
|
|
- q2, qt, wq: QbeGen.QVal;
|
|
|
|
|
- isR, isL: BOOLEAN;
|
|
|
|
|
|
|
+ q2, qt, wq, qf:
|
|
|
|
|
+ QbeGen.QVal;
|
|
|
|
|
+ isR, isL, folded: BOOLEAN;
|
|
|
lw, rw, mw: CARDINAL; .)
|
|
lw, rw, mw: CARDINAL; .)
|
|
|
= Fact<t, q> { MulOp<op> Fact<t2, q2>
|
|
= Fact<t, q> { MulOp<op> Fact<t2, q2>
|
|
|
(. IF op = SymTab.OpAnd THEN
|
|
(. IF op = SymTab.OpAnd THEN
|
|
@@ -1668,6 +1713,19 @@ PRODUCTIONS
|
|
|
IF t # SymTab.InvalidType THEN
|
|
IF t # SymTab.InvalidType THEN
|
|
|
isL := SymTab.IsLongFamily(t);
|
|
isL := SymTab.IsLongFamily(t);
|
|
|
isR := SymTab.ClassOf(t) = SymTab.ClReal;
|
|
isR := SymTab.ClassOf(t) = SymTab.ClReal;
|
|
|
|
|
+ folded := FALSE;
|
|
|
|
|
+ IF (NOT isL) AND (NOT isR)
|
|
|
|
|
+ AND QbeGen.IsImm(q) AND QbeGen.IsImm(q2) THEN
|
|
|
|
|
+ IF op = SymTab.OpTimes THEN
|
|
|
|
|
+ folded := QbeGen.Fold2(2, q, q2, qf)
|
|
|
|
|
+ ELSIF op = SymTab.OpDiv THEN
|
|
|
|
|
+ folded := QbeGen.Fold2(3, q, q2, qf)
|
|
|
|
|
+ ELSIF op = SymTab.OpMod THEN
|
|
|
|
|
+ folded := QbeGen.Fold2(4, q, q2, qf)
|
|
|
|
|
+ END
|
|
|
|
|
+ END;
|
|
|
|
|
+ IF folded THEN QbeGen.CopyOp(qf, q)
|
|
|
|
|
+ ELSE
|
|
|
IF isL THEN
|
|
IF isL THEN
|
|
|
IF SymTab.IsIntFamily(lt) THEN
|
|
IF SymTab.IsIntFamily(lt) THEN
|
|
|
QbeGen.WidenLong(q, wq); QbeGen.CopyOp(wq, q)
|
|
QbeGen.WidenLong(q, wq); QbeGen.CopyOp(wq, q)
|
|
@@ -1696,6 +1754,7 @@ PRODUCTIONS
|
|
|
END
|
|
END
|
|
|
END;
|
|
END;
|
|
|
QbeGen.CopyOp(qt, q)
|
|
QbeGen.CopyOp(qt, q)
|
|
|
|
|
+ END
|
|
|
ELSE QbeGen.CopyOp("0", q)
|
|
ELSE QbeGen.CopyOp("0", q)
|
|
|
END
|
|
END
|
|
|
END; .) } .
|
|
END; .) } .
|