|
@@ -3792,7 +3792,7 @@ Listing:
|
|
|
3773 (. t := SymTab.RealType();
|
|
3773 (. t := SymTab.RealType();
|
|
|
3774 IF QbeGen.IsImm(q) AND SymTab.ConstInt(q, lo) THEN QbeGen.NormReal(q, qa); QbeGen.CopyOp(qa, q)
|
|
3774 IF QbeGen.IsImm(q) AND SymTab.ConstInt(q, lo) THEN QbeGen.NormReal(q, qa); QbeGen.CopyOp(qa, q)
|
|
|
3775 ELSE QbeGen.CopyOp("@", q) END; .)
|
|
3775 ELSE QbeGen.CopyOp("@", q) END; .)
|
|
|
- 3776 | ( "VAL" | "CONVERT" ) "(" GetIdent<vn> (. astArg2 := AST.MakeLeaf(AST.NkIdent, vn); .) "," Expr<et, q> ")"
|
|
|
|
|
|
|
+ 3776 | ( "VAL" | "CONVERT" | "CAST" ) "(" GetIdent<vn> (. astArg2 := AST.MakeLeaf(AST.NkIdent, vn); .) "," Expr<et, q> ")"
|
|
|
3777 (. astNode := AST.MakeNode(AST.NkCall);
|
|
3777 (. astNode := AST.MakeNode(AST.NkCall);
|
|
|
3778 AST.SetChild(astNode, 0, AST.MakeLeaf(AST.NkIdent, "VAL"));
|
|
3778 AST.SetChild(astNode, 0, AST.MakeLeaf(AST.NkIdent, "VAL"));
|
|
|
3779 IF astArg2 # AST.NoNode THEN AST.SetChild(astNode, 1, astArg2) END;
|
|
3779 IF astArg2 # AST.NoNode THEN AST.SetChild(astNode, 1, astArg2) END;
|
|
@@ -3867,244 +3867,248 @@ Listing:
|
|
|
3848 ELSIF (c1 = SymTab.ClReal)
|
|
3848 ELSIF (c1 = SymTab.ClReal)
|
|
|
3849 AND (c2 = SymTab.ClReal) THEN
|
|
3849 AND (c2 = SymTab.ClReal) THEN
|
|
|
3850 t := vt
|
|
3850 t := vt
|
|
|
- 3851 ELSE SemError(230);
|
|
|
|
|
- 3852 t := SymTab.InvalidType
|
|
|
|
|
- 3853 END
|
|
|
|
|
- 3854 END
|
|
|
|
|
- 3855 END; .)
|
|
|
|
|
- 3856 | "(" Expr<et, q> ")" (. t := et; astIsLit := TRUE; .)
|
|
|
|
|
- 3857 | SetLit<st, sq> (. astIsLit := TRUE; t := st;
|
|
|
|
|
- 3858 QbeGen.CopyOp(sq, q); .)
|
|
|
|
|
- 3859 | ( "NOT" | "~" ) Fact<t2, q2> (. astNot := astCur;
|
|
|
|
|
- 3860 IF SymTab.BoolCheck(t2) THEN
|
|
|
|
|
- 3861 t := SymTab.BoolType()
|
|
|
|
|
- 3862 ELSE SemError(212);
|
|
|
|
|
- 3863 t := SymTab.InvalidType END;
|
|
|
|
|
- 3864 IF t # SymTab.InvalidType THEN
|
|
|
|
|
- 3865 QbeGen.CopyOp("@", q)
|
|
|
|
|
- 3866 ELSE QbeGen.CopyOp("0", q)
|
|
|
|
|
- 3867 END;
|
|
|
|
|
- 3868 astIsLit := TRUE;
|
|
|
|
|
- 3869 astCur := AST.MakeUn(
|
|
|
|
|
- 3870 AST.NkUnary, AST.OpNot, astNot); .)
|
|
|
|
|
- 3871 )
|
|
|
|
|
- 3872 (. IF NOT astIsLit THEN astCur := AST.NoNode END; .)
|
|
|
|
|
- 3873 (. IF astCur # AST.NoNode THEN AST.SetTy(astCur, t) END; .) .
|
|
|
|
|
- 3874 (* Set literals are SET OF [0..255] (8 words); elements validated
|
|
|
|
|
- 3875 0..255 statically when foldable (222 otherwise), runtime trap
|
|
|
|
|
- 3876 for computed elements. Ranges always lower via SetRange. *)
|
|
|
|
|
- 3877 SetLit<VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
|
|
- 3878 (. VAR astNode: AST.Node; .)
|
|
|
|
|
- 3879 = "{" (. t := SymTab.NewSet(
|
|
|
|
|
- 3880 SymTab.NewSubR(0, 255));
|
|
|
|
|
- 3881 astNode := AST.MakeNode(AST.NkSetLit);
|
|
|
|
|
- 3882 QbeGen.NewSetTemp(8, q);
|
|
|
|
|
- 3883 QbeGen.SetZero(q, 8); .)
|
|
|
|
|
- 3884 [ SetElem<t, q, astNode> { "," SetElem<t, q, astNode> } ]
|
|
|
|
|
- 3885 "}" (. astCur := astNode; .) .
|
|
|
|
|
- 3886 (* Typed brace constructor: TypeName{ elems } — BITSET{0} (a set)
|
|
|
|
|
- 3887 or ArrayName{...} (an array constructor, GNU Modula-2). The
|
|
|
|
|
- 3888 declared type sets the width (set) or element type (array). *)
|
|
|
|
|
- 3889 TypedBraceLit<vt: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
|
|
- 3890 (. VAR nw: CARDINAL;
|
|
|
|
|
- 3891 astNode, astTail: AST.Node;
|
|
|
|
|
- 3892 savedCls: INTEGER; .)
|
|
|
|
|
- 3893 = "{" (. savedCls := braceCls;
|
|
|
|
|
- 3894 astNode := AST.MakeNode(AST.NkBraceLit);
|
|
|
|
|
- 3895 AST.SetTy(astNode, vt);
|
|
|
|
|
- 3896 astTail := astNode;
|
|
|
|
|
- 3897 IF vt = SymTab.InvalidType THEN
|
|
|
|
|
- 3898 braceCls := -1
|
|
|
|
|
- 3899 ELSE braceCls :=
|
|
|
|
|
- 3900 SymTab.ClassOf(vt)
|
|
|
|
|
- 3901 END;
|
|
|
|
|
- 3902 IF braceCls = SymTab.ClSet THEN
|
|
|
|
|
- 3903 IF vt = SymTab.InvalidType THEN
|
|
|
|
|
- 3904 nw := 8
|
|
|
|
|
- 3905 ELSE nw := SymTab.SetWords(vt);
|
|
|
|
|
- 3906 IF nw = 0 THEN nw := 8 END
|
|
|
|
|
- 3907 END;
|
|
|
|
|
- 3908 QbeGen.NewSetTemp(nw, q);
|
|
|
|
|
- 3909 QbeGen.SetZero(q, nw)
|
|
|
|
|
- 3910 ELSIF (braceCls =
|
|
|
|
|
- 3911 SymTab.ClArray)
|
|
|
|
|
- 3912 OR (braceCls =
|
|
|
|
|
- 3913 SymTab.ClRecord)
|
|
|
|
|
- 3914 OR (braceCls =
|
|
|
|
|
- 3915 SymTab.ClClass) THEN
|
|
|
|
|
- 3916 QbeGen.CtorBegin(vt)
|
|
|
|
|
- 3917 ELSE
|
|
|
|
|
- 3918 IF vt # SymTab.InvalidType THEN
|
|
|
|
|
- 3919 SemError(230) END;
|
|
|
|
|
- 3920 braceCls := -1
|
|
|
|
|
- 3921 END; .)
|
|
|
|
|
- 3922 [ BraceElem<vt, q, astNode, astTail>
|
|
|
|
|
- 3923 { "," BraceElem<vt, q, astNode, astTail> } ]
|
|
|
|
|
- 3924 "}" (. IF (braceCls = SymTab.ClArray)
|
|
|
|
|
- 3925 OR (braceCls =
|
|
|
|
|
- 3926 SymTab.ClRecord)
|
|
|
|
|
- 3927 OR (braceCls =
|
|
|
|
|
- 3928 SymTab.ClClass) THEN
|
|
|
|
|
- 3929 QbeGen.CtorEnd(q)
|
|
|
|
|
- 3930 ELSIF braceCls # SymTab.ClSet THEN
|
|
|
|
|
- 3931 QbeGen.CopyOp("0", q)
|
|
|
|
|
- 3932 END;
|
|
|
|
|
- 3933 braceCls := savedCls; .)
|
|
|
|
|
- 3934 (. astCur := astNode; .) .
|
|
|
|
|
- 3935 BraceElem<vt: SymTab.TypeIndex; VAR sq: QbeGen.QVal;
|
|
|
|
|
- 3936 VAR node, tail: AST.Node>
|
|
|
|
|
- 3937 (. VAR et, et2: SymTab.TypeIndex;
|
|
|
|
|
- 3938 qe, q2: QbeGen.QVal;
|
|
|
|
|
- 3939 v, v2, reps, k: INTEGER;
|
|
|
|
|
- 3940 elem: SymTab.TypeIndex;
|
|
|
|
|
- 3941 lo: INTEGER;
|
|
|
|
|
- 3942 span: CARDINAL;
|
|
|
|
|
- 3943 cl, cl2: INTEGER;
|
|
|
|
|
- 3944 hasR, hasB: BOOLEAN;
|
|
|
|
|
- 3945 astEl: AST.Node; .)
|
|
|
|
|
- 3946 = (. hasR := FALSE; hasB := FALSE;
|
|
|
|
|
- 3947 reps := 1; .)
|
|
|
|
|
- 3948 Expr<et, qe> (. astEl := astCur; .)
|
|
|
|
|
- 3949 [ ".." Expr<et2, q2> (. astEl := AST.MakeBin(
|
|
|
|
|
- 3950 AST.NkSubrange, 0, astEl, astCur);
|
|
|
|
|
- 3951 hasR := TRUE; .) ]
|
|
|
|
|
- 3952 [ "BY" Expr<et2, q2> (. hasB := TRUE; .) ]
|
|
|
|
|
- 3953 (. IF braceCls = SymTab.ClSet THEN
|
|
|
|
|
- 3954 IF hasB THEN SemError(230) END;
|
|
|
|
|
- 3955 lo := SymTab.SetBaseLo(vt);
|
|
|
|
|
- 3956 span := SymTab.SetCount(vt);
|
|
|
|
|
- 3957 IF (et = SymTab.InvalidType)
|
|
|
|
|
- 3958 OR (hasR AND (et2 =
|
|
|
|
|
- 3959 SymTab.InvalidType)) THEN
|
|
|
|
|
- 3960 ELSE cl :=
|
|
|
|
|
- 3961 SymTab.ClassOf(et);
|
|
|
|
|
- 3962 IF hasR THEN
|
|
|
|
|
- 3963 cl2 :=
|
|
|
|
|
- 3964 SymTab.ClassOf(et2)
|
|
|
|
|
- 3965 ELSE cl2 := SymTab.ClInt
|
|
|
|
|
- 3966 END;
|
|
|
|
|
- 3967 IF NOT SymTab.SetElemClassOk(cl)
|
|
|
|
|
- 3968 OR (hasR AND NOT
|
|
|
|
|
- 3969 SymTab.SetElemClassOk(cl2))
|
|
|
|
|
- 3970 THEN
|
|
|
|
|
- 3971 SemError(222)
|
|
|
|
|
- 3972 ELSIF hasR
|
|
|
|
|
- 3973 AND SymTab.ConstInt(qe, v)
|
|
|
|
|
- 3974 AND SymTab.ConstInt(q2,
|
|
|
|
|
- 3975 v2)
|
|
|
|
|
- 3976 AND ((v < lo)
|
|
|
|
|
- 3977 OR (v2 < lo)
|
|
|
|
|
- 3978 OR (v >= lo +
|
|
|
|
|
- 3979 VAL(INTEGER, span))
|
|
|
|
|
- 3980 OR (v2 >= lo +
|
|
|
|
|
- 3981 VAL(INTEGER, span))
|
|
|
|
|
- 3982 OR (v > v2)) THEN
|
|
|
|
|
- 3983 SemError(222)
|
|
|
|
|
- 3984 ELSIF hasR THEN
|
|
|
|
|
- 3985 QbeGen.SetRange(sq, qe, q2,
|
|
|
|
|
- 3986 lo, span)
|
|
|
|
|
- 3987 ELSIF SymTab.ConstInt(qe,
|
|
|
|
|
- 3988 v)
|
|
|
|
|
- 3989 AND ((v < lo)
|
|
|
|
|
- 3990 OR (v >= lo +
|
|
|
|
|
- 3991 VAL(INTEGER,
|
|
|
|
|
- 3992 span))) THEN
|
|
|
|
|
- 3993 SemError(222)
|
|
|
|
|
- 3994 ELSE QbeGen.SetBit(sq, qe,
|
|
|
|
|
- 3995 lo, span)
|
|
|
|
|
- 3996 END
|
|
|
|
|
- 3997 END
|
|
|
|
|
- 3998 ELSIF (braceCls = SymTab.ClArray)
|
|
|
|
|
- 3999 OR (braceCls =
|
|
|
|
|
- 4000 SymTab.ClRecord)
|
|
|
|
|
- 4001 OR (braceCls =
|
|
|
|
|
- 4002 SymTab.ClClass) THEN
|
|
|
|
|
- 4003 IF hasR THEN SemError(230) END;
|
|
|
|
|
- 4004 reps := 1;
|
|
|
|
|
- 4005 IF hasB THEN
|
|
|
|
|
- 4006 IF SymTab.ConstInt(q2, v2)
|
|
|
|
|
- 4007 AND (v2 >= 1) THEN
|
|
|
|
|
- 4008 reps := v2
|
|
|
|
|
- 4009 ELSE SemError(230)
|
|
|
|
|
- 4010 END
|
|
|
|
|
- 4011 END;
|
|
|
|
|
- 4012 k := 0;
|
|
|
|
|
- 4013 WHILE k < reps DO
|
|
|
|
|
- 4014 QbeGen.CtorElem(qe);
|
|
|
|
|
- 4015 INC(k)
|
|
|
|
|
- 4016 END
|
|
|
|
|
- 4017 END; .)
|
|
|
|
|
- 4018 (. (* the BY form repeats the
|
|
|
|
|
- 4019 element; keep the AST in
|
|
|
|
|
- 4020 step with CtorElem *)
|
|
|
|
|
- 4021 k := 0;
|
|
|
|
|
- 4022 WHILE k < reps DO
|
|
|
|
|
- 4023 AstAppend(AST.NkBlock,
|
|
|
|
|
- 4024 node, tail, astEl);
|
|
|
|
|
- 4025 INC(k)
|
|
|
|
|
- 4026 END; .) .
|
|
|
|
|
- 4027 SetElem<st: SymTab.TypeIndex; sq: QbeGen.QVal; node: AST.Node> (. VAR et, et2: SymTab.TypeIndex;
|
|
|
|
|
- 4028 qe, q2: QbeGen.QVal;
|
|
|
|
|
- 4029 v, v2: INTEGER;
|
|
|
|
|
- 4030 lo: INTEGER;
|
|
|
|
|
- 4031 span: CARDINAL;
|
|
|
|
|
- 4032 cl, cl2: INTEGER;
|
|
|
|
|
- 4033 hasR: BOOLEAN;
|
|
|
|
|
- 4034 astEl: AST.Node; .)
|
|
|
|
|
- 4035 = (. hasR := FALSE; .)
|
|
|
|
|
- 4036 Expr<et, qe> (. astEl := astCur; .)
|
|
|
|
|
- 4037 [ ".." Expr<et2, q2> (. astEl := AST.MakeBin(
|
|
|
|
|
- 4038 AST.NkSubrange, 0, astEl, astCur);
|
|
|
|
|
- 4039 hasR := TRUE; .) ]
|
|
|
|
|
- 4040 (. lo := SymTab.SetBaseLo(st);
|
|
|
|
|
- 4041 span := SymTab.SetCount(st);
|
|
|
|
|
- 4042 IF (et = SymTab.InvalidType)
|
|
|
|
|
- 4043 OR (hasR AND (et2 =
|
|
|
|
|
- 4044 SymTab.InvalidType)) THEN
|
|
|
|
|
- 4045 ELSE cl :=
|
|
|
|
|
- 4046 SymTab.ClassOf(et);
|
|
|
|
|
- 4047 IF hasR THEN
|
|
|
|
|
- 4048 cl2 :=
|
|
|
|
|
- 4049 SymTab.ClassOf(et2)
|
|
|
|
|
- 4050 ELSE cl2 := SymTab.ClInt
|
|
|
|
|
- 4051 END;
|
|
|
|
|
- 4052 IF NOT SymTab.SetElemClassOk(cl)
|
|
|
|
|
- 4053 OR (hasR AND NOT
|
|
|
|
|
- 4054 SymTab.SetElemClassOk(cl2))
|
|
|
|
|
- 4055 THEN
|
|
|
|
|
- 4056 SemError(222)
|
|
|
|
|
- 4057 ELSIF hasR
|
|
|
|
|
- 4058 AND SymTab.ConstInt(qe, v)
|
|
|
|
|
- 4059 AND SymTab.ConstInt(q2,
|
|
|
|
|
- 4060 v2)
|
|
|
|
|
- 4061 AND ((v < lo)
|
|
|
|
|
- 4062 OR (v2 < lo)
|
|
|
|
|
- 4063 OR (v >= lo +
|
|
|
|
|
- 4064 VAL(INTEGER, span))
|
|
|
|
|
- 4065 OR (v2 >= lo +
|
|
|
|
|
- 4066 VAL(INTEGER, span))
|
|
|
|
|
- 4067 OR (v > v2)) THEN
|
|
|
|
|
- 4068 SemError(222)
|
|
|
|
|
- 4069 ELSIF hasR THEN
|
|
|
|
|
- 4070 QbeGen.SetRange(sq, qe, q2,
|
|
|
|
|
- 4071 lo, span)
|
|
|
|
|
- 4072 ELSIF SymTab.ConstInt(qe,
|
|
|
|
|
- 4073 v)
|
|
|
|
|
- 4074 AND ((v < lo)
|
|
|
|
|
- 4075 OR (v >= lo +
|
|
|
|
|
- 4076 VAL(INTEGER,
|
|
|
|
|
- 4077 span))) THEN
|
|
|
|
|
- 4078 SemError(222)
|
|
|
|
|
- 4079 ELSE QbeGen.SetBit(sq, qe,
|
|
|
|
|
- 4080 lo, span)
|
|
|
|
|
- 4081 END
|
|
|
|
|
- 4082 END; .)
|
|
|
|
|
- 4083 (. AST.SetChild(node,
|
|
|
|
|
- 4084 AST.NChild(node), astEl); .) .
|
|
|
|
|
- 4085 GetIdent<VAR n: SymTab.Name>
|
|
|
|
|
- 4086 = ident (. LexName(n); .) .
|
|
|
|
|
- 4087
|
|
|
|
|
- 4088 END M2.
|
|
|
|
|
|
|
+ 3851 ELSIF ((c1 = SymTab.ClSet) AND (c2 = SymTab.ClInt))
|
|
|
|
|
+ 3852 OR ((c1 = SymTab.ClInt) AND (c2 = SymTab.ClSet)) THEN
|
|
|
|
|
+ 3853 (* a set <-> its machine word (BITSET) *)
|
|
|
|
|
+ 3854 t := vt
|
|
|
|
|
+ 3855 ELSE SemError(230);
|
|
|
|
|
+ 3856 t := SymTab.InvalidType
|
|
|
|
|
+ 3857 END
|
|
|
|
|
+ 3858 END
|
|
|
|
|
+ 3859 END; .)
|
|
|
|
|
+ 3860 | "(" Expr<et, q> ")" (. t := et; astIsLit := TRUE; .)
|
|
|
|
|
+ 3861 | SetLit<st, sq> (. astIsLit := TRUE; t := st;
|
|
|
|
|
+ 3862 QbeGen.CopyOp(sq, q); .)
|
|
|
|
|
+ 3863 | ( "NOT" | "~" ) Fact<t2, q2> (. astNot := astCur;
|
|
|
|
|
+ 3864 IF SymTab.BoolCheck(t2) THEN
|
|
|
|
|
+ 3865 t := SymTab.BoolType()
|
|
|
|
|
+ 3866 ELSE SemError(212);
|
|
|
|
|
+ 3867 t := SymTab.InvalidType END;
|
|
|
|
|
+ 3868 IF t # SymTab.InvalidType THEN
|
|
|
|
|
+ 3869 QbeGen.CopyOp("@", q)
|
|
|
|
|
+ 3870 ELSE QbeGen.CopyOp("0", q)
|
|
|
|
|
+ 3871 END;
|
|
|
|
|
+ 3872 astIsLit := TRUE;
|
|
|
|
|
+ 3873 astCur := AST.MakeUn(
|
|
|
|
|
+ 3874 AST.NkUnary, AST.OpNot, astNot); .)
|
|
|
|
|
+ 3875 )
|
|
|
|
|
+ 3876 (. IF NOT astIsLit THEN astCur := AST.NoNode END; .)
|
|
|
|
|
+ 3877 (. IF astCur # AST.NoNode THEN AST.SetTy(astCur, t) END; .) .
|
|
|
|
|
+ 3878 (* Set literals are SET OF [0..255] (8 words); elements validated
|
|
|
|
|
+ 3879 0..255 statically when foldable (222 otherwise), runtime trap
|
|
|
|
|
+ 3880 for computed elements. Ranges always lower via SetRange. *)
|
|
|
|
|
+ 3881 SetLit<VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
|
|
+ 3882 (. VAR astNode: AST.Node; .)
|
|
|
|
|
+ 3883 = "{" (. t := SymTab.NewSet(
|
|
|
|
|
+ 3884 SymTab.NewSubR(0, 255));
|
|
|
|
|
+ 3885 astNode := AST.MakeNode(AST.NkSetLit);
|
|
|
|
|
+ 3886 QbeGen.NewSetTemp(8, q);
|
|
|
|
|
+ 3887 QbeGen.SetZero(q, 8); .)
|
|
|
|
|
+ 3888 [ SetElem<t, q, astNode> { "," SetElem<t, q, astNode> } ]
|
|
|
|
|
+ 3889 "}" (. astCur := astNode; .) .
|
|
|
|
|
+ 3890 (* Typed brace constructor: TypeName{ elems } — BITSET{0} (a set)
|
|
|
|
|
+ 3891 or ArrayName{...} (an array constructor, GNU Modula-2). The
|
|
|
|
|
+ 3892 declared type sets the width (set) or element type (array). *)
|
|
|
|
|
+ 3893 TypedBraceLit<vt: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
|
|
+ 3894 (. VAR nw: CARDINAL;
|
|
|
|
|
+ 3895 astNode, astTail: AST.Node;
|
|
|
|
|
+ 3896 savedCls: INTEGER; .)
|
|
|
|
|
+ 3897 = "{" (. savedCls := braceCls;
|
|
|
|
|
+ 3898 astNode := AST.MakeNode(AST.NkBraceLit);
|
|
|
|
|
+ 3899 AST.SetTy(astNode, vt);
|
|
|
|
|
+ 3900 astTail := astNode;
|
|
|
|
|
+ 3901 IF vt = SymTab.InvalidType THEN
|
|
|
|
|
+ 3902 braceCls := -1
|
|
|
|
|
+ 3903 ELSE braceCls :=
|
|
|
|
|
+ 3904 SymTab.ClassOf(vt)
|
|
|
|
|
+ 3905 END;
|
|
|
|
|
+ 3906 IF braceCls = SymTab.ClSet THEN
|
|
|
|
|
+ 3907 IF vt = SymTab.InvalidType THEN
|
|
|
|
|
+ 3908 nw := 8
|
|
|
|
|
+ 3909 ELSE nw := SymTab.SetWords(vt);
|
|
|
|
|
+ 3910 IF nw = 0 THEN nw := 8 END
|
|
|
|
|
+ 3911 END;
|
|
|
|
|
+ 3912 QbeGen.NewSetTemp(nw, q);
|
|
|
|
|
+ 3913 QbeGen.SetZero(q, nw)
|
|
|
|
|
+ 3914 ELSIF (braceCls =
|
|
|
|
|
+ 3915 SymTab.ClArray)
|
|
|
|
|
+ 3916 OR (braceCls =
|
|
|
|
|
+ 3917 SymTab.ClRecord)
|
|
|
|
|
+ 3918 OR (braceCls =
|
|
|
|
|
+ 3919 SymTab.ClClass) THEN
|
|
|
|
|
+ 3920 QbeGen.CtorBegin(vt)
|
|
|
|
|
+ 3921 ELSE
|
|
|
|
|
+ 3922 IF vt # SymTab.InvalidType THEN
|
|
|
|
|
+ 3923 SemError(230) END;
|
|
|
|
|
+ 3924 braceCls := -1
|
|
|
|
|
+ 3925 END; .)
|
|
|
|
|
+ 3926 [ BraceElem<vt, q, astNode, astTail>
|
|
|
|
|
+ 3927 { "," BraceElem<vt, q, astNode, astTail> } ]
|
|
|
|
|
+ 3928 "}" (. IF (braceCls = SymTab.ClArray)
|
|
|
|
|
+ 3929 OR (braceCls =
|
|
|
|
|
+ 3930 SymTab.ClRecord)
|
|
|
|
|
+ 3931 OR (braceCls =
|
|
|
|
|
+ 3932 SymTab.ClClass) THEN
|
|
|
|
|
+ 3933 QbeGen.CtorEnd(q)
|
|
|
|
|
+ 3934 ELSIF braceCls # SymTab.ClSet THEN
|
|
|
|
|
+ 3935 QbeGen.CopyOp("0", q)
|
|
|
|
|
+ 3936 END;
|
|
|
|
|
+ 3937 braceCls := savedCls; .)
|
|
|
|
|
+ 3938 (. astCur := astNode; .) .
|
|
|
|
|
+ 3939 BraceElem<vt: SymTab.TypeIndex; VAR sq: QbeGen.QVal;
|
|
|
|
|
+ 3940 VAR node, tail: AST.Node>
|
|
|
|
|
+ 3941 (. VAR et, et2: SymTab.TypeIndex;
|
|
|
|
|
+ 3942 qe, q2: QbeGen.QVal;
|
|
|
|
|
+ 3943 v, v2, reps, k: INTEGER;
|
|
|
|
|
+ 3944 elem: SymTab.TypeIndex;
|
|
|
|
|
+ 3945 lo: INTEGER;
|
|
|
|
|
+ 3946 span: CARDINAL;
|
|
|
|
|
+ 3947 cl, cl2: INTEGER;
|
|
|
|
|
+ 3948 hasR, hasB: BOOLEAN;
|
|
|
|
|
+ 3949 astEl: AST.Node; .)
|
|
|
|
|
+ 3950 = (. hasR := FALSE; hasB := FALSE;
|
|
|
|
|
+ 3951 reps := 1; .)
|
|
|
|
|
+ 3952 Expr<et, qe> (. astEl := astCur; .)
|
|
|
|
|
+ 3953 [ ".." Expr<et2, q2> (. astEl := AST.MakeBin(
|
|
|
|
|
+ 3954 AST.NkSubrange, 0, astEl, astCur);
|
|
|
|
|
+ 3955 hasR := TRUE; .) ]
|
|
|
|
|
+ 3956 [ "BY" Expr<et2, q2> (. hasB := TRUE; .) ]
|
|
|
|
|
+ 3957 (. IF braceCls = SymTab.ClSet THEN
|
|
|
|
|
+ 3958 IF hasB THEN SemError(230) END;
|
|
|
|
|
+ 3959 lo := SymTab.SetBaseLo(vt);
|
|
|
|
|
+ 3960 span := SymTab.SetCount(vt);
|
|
|
|
|
+ 3961 IF (et = SymTab.InvalidType)
|
|
|
|
|
+ 3962 OR (hasR AND (et2 =
|
|
|
|
|
+ 3963 SymTab.InvalidType)) THEN
|
|
|
|
|
+ 3964 ELSE cl :=
|
|
|
|
|
+ 3965 SymTab.ClassOf(et);
|
|
|
|
|
+ 3966 IF hasR THEN
|
|
|
|
|
+ 3967 cl2 :=
|
|
|
|
|
+ 3968 SymTab.ClassOf(et2)
|
|
|
|
|
+ 3969 ELSE cl2 := SymTab.ClInt
|
|
|
|
|
+ 3970 END;
|
|
|
|
|
+ 3971 IF NOT SymTab.SetElemClassOk(cl)
|
|
|
|
|
+ 3972 OR (hasR AND NOT
|
|
|
|
|
+ 3973 SymTab.SetElemClassOk(cl2))
|
|
|
|
|
+ 3974 THEN
|
|
|
|
|
+ 3975 SemError(222)
|
|
|
|
|
+ 3976 ELSIF hasR
|
|
|
|
|
+ 3977 AND SymTab.ConstInt(qe, v)
|
|
|
|
|
+ 3978 AND SymTab.ConstInt(q2,
|
|
|
|
|
+ 3979 v2)
|
|
|
|
|
+ 3980 AND ((v < lo)
|
|
|
|
|
+ 3981 OR (v2 < lo)
|
|
|
|
|
+ 3982 OR (v >= lo +
|
|
|
|
|
+ 3983 VAL(INTEGER, span))
|
|
|
|
|
+ 3984 OR (v2 >= lo +
|
|
|
|
|
+ 3985 VAL(INTEGER, span))
|
|
|
|
|
+ 3986 OR (v > v2)) THEN
|
|
|
|
|
+ 3987 SemError(222)
|
|
|
|
|
+ 3988 ELSIF hasR THEN
|
|
|
|
|
+ 3989 QbeGen.SetRange(sq, qe, q2,
|
|
|
|
|
+ 3990 lo, span)
|
|
|
|
|
+ 3991 ELSIF SymTab.ConstInt(qe,
|
|
|
|
|
+ 3992 v)
|
|
|
|
|
+ 3993 AND ((v < lo)
|
|
|
|
|
+ 3994 OR (v >= lo +
|
|
|
|
|
+ 3995 VAL(INTEGER,
|
|
|
|
|
+ 3996 span))) THEN
|
|
|
|
|
+ 3997 SemError(222)
|
|
|
|
|
+ 3998 ELSE QbeGen.SetBit(sq, qe,
|
|
|
|
|
+ 3999 lo, span)
|
|
|
|
|
+ 4000 END
|
|
|
|
|
+ 4001 END
|
|
|
|
|
+ 4002 ELSIF (braceCls = SymTab.ClArray)
|
|
|
|
|
+ 4003 OR (braceCls =
|
|
|
|
|
+ 4004 SymTab.ClRecord)
|
|
|
|
|
+ 4005 OR (braceCls =
|
|
|
|
|
+ 4006 SymTab.ClClass) THEN
|
|
|
|
|
+ 4007 IF hasR THEN SemError(230) END;
|
|
|
|
|
+ 4008 reps := 1;
|
|
|
|
|
+ 4009 IF hasB THEN
|
|
|
|
|
+ 4010 IF SymTab.ConstInt(q2, v2)
|
|
|
|
|
+ 4011 AND (v2 >= 1) THEN
|
|
|
|
|
+ 4012 reps := v2
|
|
|
|
|
+ 4013 ELSE SemError(230)
|
|
|
|
|
+ 4014 END
|
|
|
|
|
+ 4015 END;
|
|
|
|
|
+ 4016 k := 0;
|
|
|
|
|
+ 4017 WHILE k < reps DO
|
|
|
|
|
+ 4018 QbeGen.CtorElem(qe);
|
|
|
|
|
+ 4019 INC(k)
|
|
|
|
|
+ 4020 END
|
|
|
|
|
+ 4021 END; .)
|
|
|
|
|
+ 4022 (. (* the BY form repeats the
|
|
|
|
|
+ 4023 element; keep the AST in
|
|
|
|
|
+ 4024 step with CtorElem *)
|
|
|
|
|
+ 4025 k := 0;
|
|
|
|
|
+ 4026 WHILE k < reps DO
|
|
|
|
|
+ 4027 AstAppend(AST.NkBlock,
|
|
|
|
|
+ 4028 node, tail, astEl);
|
|
|
|
|
+ 4029 INC(k)
|
|
|
|
|
+ 4030 END; .) .
|
|
|
|
|
+ 4031 SetElem<st: SymTab.TypeIndex; sq: QbeGen.QVal; node: AST.Node> (. VAR et, et2: SymTab.TypeIndex;
|
|
|
|
|
+ 4032 qe, q2: QbeGen.QVal;
|
|
|
|
|
+ 4033 v, v2: INTEGER;
|
|
|
|
|
+ 4034 lo: INTEGER;
|
|
|
|
|
+ 4035 span: CARDINAL;
|
|
|
|
|
+ 4036 cl, cl2: INTEGER;
|
|
|
|
|
+ 4037 hasR: BOOLEAN;
|
|
|
|
|
+ 4038 astEl: AST.Node; .)
|
|
|
|
|
+ 4039 = (. hasR := FALSE; .)
|
|
|
|
|
+ 4040 Expr<et, qe> (. astEl := astCur; .)
|
|
|
|
|
+ 4041 [ ".." Expr<et2, q2> (. astEl := AST.MakeBin(
|
|
|
|
|
+ 4042 AST.NkSubrange, 0, astEl, astCur);
|
|
|
|
|
+ 4043 hasR := TRUE; .) ]
|
|
|
|
|
+ 4044 (. lo := SymTab.SetBaseLo(st);
|
|
|
|
|
+ 4045 span := SymTab.SetCount(st);
|
|
|
|
|
+ 4046 IF (et = SymTab.InvalidType)
|
|
|
|
|
+ 4047 OR (hasR AND (et2 =
|
|
|
|
|
+ 4048 SymTab.InvalidType)) THEN
|
|
|
|
|
+ 4049 ELSE cl :=
|
|
|
|
|
+ 4050 SymTab.ClassOf(et);
|
|
|
|
|
+ 4051 IF hasR THEN
|
|
|
|
|
+ 4052 cl2 :=
|
|
|
|
|
+ 4053 SymTab.ClassOf(et2)
|
|
|
|
|
+ 4054 ELSE cl2 := SymTab.ClInt
|
|
|
|
|
+ 4055 END;
|
|
|
|
|
+ 4056 IF NOT SymTab.SetElemClassOk(cl)
|
|
|
|
|
+ 4057 OR (hasR AND NOT
|
|
|
|
|
+ 4058 SymTab.SetElemClassOk(cl2))
|
|
|
|
|
+ 4059 THEN
|
|
|
|
|
+ 4060 SemError(222)
|
|
|
|
|
+ 4061 ELSIF hasR
|
|
|
|
|
+ 4062 AND SymTab.ConstInt(qe, v)
|
|
|
|
|
+ 4063 AND SymTab.ConstInt(q2,
|
|
|
|
|
+ 4064 v2)
|
|
|
|
|
+ 4065 AND ((v < lo)
|
|
|
|
|
+ 4066 OR (v2 < lo)
|
|
|
|
|
+ 4067 OR (v >= lo +
|
|
|
|
|
+ 4068 VAL(INTEGER, span))
|
|
|
|
|
+ 4069 OR (v2 >= lo +
|
|
|
|
|
+ 4070 VAL(INTEGER, span))
|
|
|
|
|
+ 4071 OR (v > v2)) THEN
|
|
|
|
|
+ 4072 SemError(222)
|
|
|
|
|
+ 4073 ELSIF hasR THEN
|
|
|
|
|
+ 4074 QbeGen.SetRange(sq, qe, q2,
|
|
|
|
|
+ 4075 lo, span)
|
|
|
|
|
+ 4076 ELSIF SymTab.ConstInt(qe,
|
|
|
|
|
+ 4077 v)
|
|
|
|
|
+ 4078 AND ((v < lo)
|
|
|
|
|
+ 4079 OR (v >= lo +
|
|
|
|
|
+ 4080 VAL(INTEGER,
|
|
|
|
|
+ 4081 span))) THEN
|
|
|
|
|
+ 4082 SemError(222)
|
|
|
|
|
+ 4083 ELSE QbeGen.SetBit(sq, qe,
|
|
|
|
|
+ 4084 lo, span)
|
|
|
|
|
+ 4085 END
|
|
|
|
|
+ 4086 END; .)
|
|
|
|
|
+ 4087 (. AST.SetChild(node,
|
|
|
|
|
+ 4088 AST.NChild(node), astEl); .) .
|
|
|
|
|
+ 4089 GetIdent<VAR n: SymTab.Name>
|
|
|
|
|
+ 4090 = ident (. LexName(n); .) .
|
|
|
|
|
+ 4091
|
|
|
|
|
+ 4092 END M2.
|
|
|
|
|
|
|
|
0 errors
|
|
0 errors
|
|
|
|
|
|
|
@@ -4115,7 +4119,7 @@ Statistics:
|
|
|
nr of non-terminals: 90 (limit 210)
|
|
nr of non-terminals: 90 (limit 210)
|
|
|
nr of pragmas: 0 (limit 387)
|
|
nr of pragmas: 0 (limit 387)
|
|
|
nr of symbolnodes: 203 (limit 500)
|
|
nr of symbolnodes: 203 (limit 500)
|
|
|
- nr of graphnodes: 1292 (limit 1500)
|
|
|
|
|
|
|
+ nr of graphnodes: 1294 (limit 1500)
|
|
|
nr of conditionsets: 12 (limit 100)
|
|
nr of conditionsets: 12 (limit 100)
|
|
|
nr of charactersets: 16 (limit 250)
|
|
nr of charactersets: 16 (limit 250)
|
|
|
|
|
|