|
|
@@ -2158,174 +2158,180 @@ Listing:
|
|
|
2141 QbeGen.CopyOp(qa, q);
|
|
|
2142 t := SymTab.CharType(); .)
|
|
|
2143 | "UCHR" "(" Expr<et, q> ")"
|
|
|
- 2144 (. IF (et # SymTab.InvalidType)
|
|
|
- 2145 AND (SymTab.ClassOf(et) # SymTab.ClChar) THEN
|
|
|
- 2146 SemError(211) END;
|
|
|
- 2147 t := SymTab.UCharType(); .)
|
|
|
- 2148 | "CHR8" "(" Expr<et, q> ")"
|
|
|
- 2149 (. IF (et # SymTab.InvalidType)
|
|
|
- 2150 AND (SymTab.ClassOf(et) # SymTab.ClUChar) THEN
|
|
|
+ 2144 (. (* UCHR: the UCHAR constructor.
|
|
|
+ 2145 CHAR -> UCHAR (identity);
|
|
|
+ 2146 INTEGER familly -> UCHAR
|
|
|
+ 2147 (codepoint value). *)
|
|
|
+ 2148 IF (et # SymTab.InvalidType)
|
|
|
+ 2149 AND (SymTab.ClassOf(et) # SymTab.ClChar)
|
|
|
+ 2150 AND NOT SymTab.IsIntFamily(et) THEN
|
|
|
2151 SemError(211) END;
|
|
|
- 2152 QbeGen.WidenLong(q, qa);
|
|
|
- 2153 QbeGen.CheckRange(qa, "0", "255");
|
|
|
- 2154 t := SymTab.CharType(); .)
|
|
|
- 2155 | "UORD" "(" Expr<et, q> ")"
|
|
|
- 2156 (. IF (et # SymTab.InvalidType)
|
|
|
- 2157 AND (SymTab.ClassOf(et) # SymTab.ClUChar) THEN
|
|
|
- 2158 SemError(211) END;
|
|
|
- 2159 QbeGen.WidenLong(q, qa);
|
|
|
- 2160 QbeGen.CopyOp(qa, q);
|
|
|
- 2161 t := SymTab.LongType(); .)
|
|
|
- 2162 | "ABS" "(" Expr<et, q> ")"
|
|
|
- 2163 (. IF (et # SymTab.InvalidType)
|
|
|
- 2164 AND NOT SymTab.IsIntFamily(et)
|
|
|
- 2165 AND (SymTab.ClassOf(et) #
|
|
|
- 2166 SymTab.ClReal) THEN
|
|
|
- 2167 SemError(211)
|
|
|
- 2168 ELSE QbeGen.AbsQ(q, qa,
|
|
|
- 2169 SymTab.ClassOf(et) =
|
|
|
- 2170 SymTab.ClReal);
|
|
|
- 2171 QbeGen.CopyOp(qa, q)
|
|
|
- 2172 END;
|
|
|
- 2173 t := et; .)
|
|
|
- 2174 | "VAL" "(" GetIdent<vn> "," Expr<et, q> ")"
|
|
|
- 2175 (. IF NOT SymTab.Lookup(vn) THEN
|
|
|
- 2176 SemError(201);
|
|
|
- 2177 t := SymTab.InvalidType
|
|
|
- 2178 ELSE vt := SymTab.SymType(vn);
|
|
|
- 2179 IF vt = SymTab.InvalidType THEN
|
|
|
- 2180 t := SymTab.InvalidType
|
|
|
- 2181 ELSIF et =
|
|
|
- 2182 SymTab.InvalidType THEN
|
|
|
- 2183 t := vt
|
|
|
- 2184 ELSE
|
|
|
- 2185 c1 := SymTab.ClassOf(et);
|
|
|
- 2186 c2 := SymTab.ClassOf(vt);
|
|
|
- 2187 IF ((c1 = SymTab.ClInt)
|
|
|
- 2188 OR (c1 =
|
|
|
- 2189 SymTab.ClChar)
|
|
|
- 2190 OR (c1 =
|
|
|
- 2191 SymTab.ClBool)
|
|
|
- 2192 OR (c1 =
|
|
|
- 2193 SymTab.ClEnum))
|
|
|
- 2194 AND ((c2 = SymTab.ClInt)
|
|
|
- 2195 OR (c2 =
|
|
|
- 2196 SymTab.ClChar)
|
|
|
- 2197 OR (c2 =
|
|
|
- 2198 SymTab.ClBool)
|
|
|
- 2199 OR (c2 =
|
|
|
- 2200 SymTab.ClEnum)) THEN
|
|
|
- 2201 t := vt
|
|
|
- 2202 ELSIF (c1 = SymTab.ClPtr)
|
|
|
- 2203 AND (c2 = SymTab.ClPtr) THEN
|
|
|
- 2204 t := vt
|
|
|
- 2205 ELSIF (c1 = SymTab.ClReal)
|
|
|
- 2206 AND (c2 = SymTab.ClReal) THEN
|
|
|
+ 2152 t := SymTab.UCharType(); .)
|
|
|
+ 2153 | "CHR8" "(" Expr<et, q> ")"
|
|
|
+ 2154 (. IF (et # SymTab.InvalidType)
|
|
|
+ 2155 AND (SymTab.ClassOf(et) # SymTab.ClUChar) THEN
|
|
|
+ 2156 SemError(211) END;
|
|
|
+ 2157 QbeGen.WidenLong(q, qa);
|
|
|
+ 2158 QbeGen.CheckRange(qa, "0", "255");
|
|
|
+ 2159 t := SymTab.CharType(); .)
|
|
|
+ 2160 | "UORD" "(" Expr<et, q> ")"
|
|
|
+ 2161 (. (* UORD(u): the codepoint as a
|
|
|
+ 2162 32-bit ordinal (INTEGER),
|
|
|
+ 2163 cf. ORD for CHAR. *)
|
|
|
+ 2164 IF (et # SymTab.InvalidType)
|
|
|
+ 2165 AND (SymTab.ClassOf(et) # SymTab.ClUChar) THEN
|
|
|
+ 2166 SemError(211) END;
|
|
|
+ 2167 t := SymTab.IntType(); .)
|
|
|
+ 2168 | "ABS" "(" Expr<et, q> ")"
|
|
|
+ 2169 (. IF (et # SymTab.InvalidType)
|
|
|
+ 2170 AND NOT SymTab.IsIntFamily(et)
|
|
|
+ 2171 AND (SymTab.ClassOf(et) #
|
|
|
+ 2172 SymTab.ClReal) THEN
|
|
|
+ 2173 SemError(211)
|
|
|
+ 2174 ELSE QbeGen.AbsQ(q, qa,
|
|
|
+ 2175 SymTab.ClassOf(et) =
|
|
|
+ 2176 SymTab.ClReal);
|
|
|
+ 2177 QbeGen.CopyOp(qa, q)
|
|
|
+ 2178 END;
|
|
|
+ 2179 t := et; .)
|
|
|
+ 2180 | "VAL" "(" GetIdent<vn> "," Expr<et, q> ")"
|
|
|
+ 2181 (. IF NOT SymTab.Lookup(vn) THEN
|
|
|
+ 2182 SemError(201);
|
|
|
+ 2183 t := SymTab.InvalidType
|
|
|
+ 2184 ELSE vt := SymTab.SymType(vn);
|
|
|
+ 2185 IF vt = SymTab.InvalidType THEN
|
|
|
+ 2186 t := SymTab.InvalidType
|
|
|
+ 2187 ELSIF et =
|
|
|
+ 2188 SymTab.InvalidType THEN
|
|
|
+ 2189 t := vt
|
|
|
+ 2190 ELSE
|
|
|
+ 2191 c1 := SymTab.ClassOf(et);
|
|
|
+ 2192 c2 := SymTab.ClassOf(vt);
|
|
|
+ 2193 IF ((c1 = SymTab.ClInt)
|
|
|
+ 2194 OR (c1 =
|
|
|
+ 2195 SymTab.ClChar)
|
|
|
+ 2196 OR (c1 =
|
|
|
+ 2197 SymTab.ClBool)
|
|
|
+ 2198 OR (c1 =
|
|
|
+ 2199 SymTab.ClEnum))
|
|
|
+ 2200 AND ((c2 = SymTab.ClInt)
|
|
|
+ 2201 OR (c2 =
|
|
|
+ 2202 SymTab.ClChar)
|
|
|
+ 2203 OR (c2 =
|
|
|
+ 2204 SymTab.ClBool)
|
|
|
+ 2205 OR (c2 =
|
|
|
+ 2206 SymTab.ClEnum)) THEN
|
|
|
2207 t := vt
|
|
|
- 2208 ELSE SemError(230);
|
|
|
- 2209 t := SymTab.InvalidType
|
|
|
- 2210 END
|
|
|
- 2211 END
|
|
|
- 2212 END; .)
|
|
|
- 2213 | "(" Expr<et, q> ")" (. t := et; .)
|
|
|
- 2214 | SetLit<st, sq> (. t := st;
|
|
|
- 2215 QbeGen.CopyOp(sq, q); .)
|
|
|
- 2216 | ( "NOT" | "~" ) Fact<t2, q2> (. IF SymTab.BoolCheck(t2) THEN
|
|
|
- 2217 t := SymTab.BoolType()
|
|
|
- 2218 ELSE SemError(212);
|
|
|
- 2219 t := SymTab.InvalidType END;
|
|
|
- 2220 IF t # SymTab.InvalidType THEN
|
|
|
- 2221 QbeGen.NotQ(q2, q)
|
|
|
- 2222 ELSE QbeGen.CopyOp("0", q)
|
|
|
- 2223 END; .) .
|
|
|
- 2224 (* Set literals are SET OF [0..255] (8 words); elements validated
|
|
|
- 2225 0..255 statically when foldable (222 otherwise), runtime trap
|
|
|
- 2226 for computed elements. Ranges always lower via SetRange. *)
|
|
|
- 2227 SetLit<VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
- 2228 = "{" (. t := SymTab.NewSet(
|
|
|
- 2229 SymTab.NewSubR(0, 255));
|
|
|
- 2230 QbeGen.NewSetTemp(8, q);
|
|
|
- 2231 QbeGen.SetZero(q, 8); .)
|
|
|
- 2232 [ SetElem<t, q> { "," SetElem<t, q> } ]
|
|
|
- 2233 "}" .
|
|
|
- 2234 (* Typed set constructor: TypeName{ elems } — e.g. BITSET{0},
|
|
|
- 2235 BITSET{}. The declared type (not SET OF [0..255]) sets the
|
|
|
- 2236 width and element span. *)
|
|
|
- 2237 TypedSetLit<vt: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
- 2238 (. VAR nw: CARDINAL; .)
|
|
|
- 2239 = "{" (. IF SymTab.ClassOf(vt) #
|
|
|
- 2240 SymTab.ClSet THEN
|
|
|
- 2241 SemError(230); nw := 8
|
|
|
- 2242 ELSE nw := SymTab.SetWords(vt);
|
|
|
- 2243 IF nw = 0 THEN nw := 8 END
|
|
|
- 2244 END;
|
|
|
- 2245 QbeGen.NewSetTemp(nw, q);
|
|
|
- 2246 QbeGen.SetZero(q, nw); .)
|
|
|
- 2247 [ SetElem<vt, q> { "," SetElem<vt, q> } ]
|
|
|
- 2248 "}" .
|
|
|
- 2249 SetElem<st: SymTab.TypeIndex; sq: QbeGen.QVal> (. VAR et, et2: SymTab.TypeIndex;
|
|
|
- 2250 qe, q2: QbeGen.QVal;
|
|
|
- 2251 v, v2: INTEGER;
|
|
|
- 2252 lo: INTEGER;
|
|
|
- 2253 span: CARDINAL;
|
|
|
- 2254 cl, cl2: INTEGER;
|
|
|
- 2255 hasR: BOOLEAN; .)
|
|
|
- 2256 = (. hasR := FALSE; .)
|
|
|
- 2257 Expr<et, qe>
|
|
|
- 2258 [ ".." Expr<et2, q2> (. hasR := TRUE; .) ]
|
|
|
- 2259 (. lo := SymTab.SetBaseLo(st);
|
|
|
- 2260 span := SymTab.SetCount(st);
|
|
|
- 2261 IF (et = SymTab.InvalidType)
|
|
|
- 2262 OR (hasR AND (et2 =
|
|
|
- 2263 SymTab.InvalidType)) THEN
|
|
|
- 2264 ELSE cl :=
|
|
|
- 2265 SymTab.ClassOf(et);
|
|
|
- 2266 IF hasR THEN
|
|
|
- 2267 cl2 :=
|
|
|
- 2268 SymTab.ClassOf(et2)
|
|
|
- 2269 ELSE cl2 := SymTab.ClInt
|
|
|
- 2270 END;
|
|
|
- 2271 IF ((cl # SymTab.ClInt)
|
|
|
- 2272 AND (cl # SymTab.ClChar)
|
|
|
- 2273 AND (cl # SymTab.ClBool))
|
|
|
- 2274 OR (hasR AND
|
|
|
- 2275 ((cl2
|
|
|
- 2276 # SymTab.ClInt)
|
|
|
- 2277 AND (cl2
|
|
|
- 2278 # SymTab.ClChar)
|
|
|
- 2279 AND (cl2
|
|
|
- 2280 # SymTab.ClBool))) THEN
|
|
|
- 2281 SemError(222)
|
|
|
- 2282 ELSIF hasR
|
|
|
- 2283 AND SymTab.ConstInt(qe, v)
|
|
|
- 2284 AND SymTab.ConstInt(q2,
|
|
|
- 2285 v2)
|
|
|
- 2286 AND ((v < lo)
|
|
|
- 2287 OR (v2 < lo)
|
|
|
- 2288 OR (v >= lo +
|
|
|
- 2289 VAL(INTEGER, span))
|
|
|
- 2290 OR (v2 >= lo +
|
|
|
- 2291 VAL(INTEGER, span))
|
|
|
- 2292 OR (v > v2)) THEN
|
|
|
- 2293 SemError(222)
|
|
|
- 2294 ELSIF hasR THEN
|
|
|
- 2295 QbeGen.SetRange(sq, qe, q2,
|
|
|
- 2296 lo, span)
|
|
|
- 2297 ELSIF SymTab.ConstInt(qe,
|
|
|
- 2298 v)
|
|
|
- 2299 AND ((v < lo)
|
|
|
- 2300 OR (v >= lo +
|
|
|
- 2301 VAL(INTEGER,
|
|
|
- 2302 span))) THEN
|
|
|
- 2303 SemError(222)
|
|
|
- 2304 ELSE QbeGen.SetBit(sq, qe,
|
|
|
- 2305 lo, span)
|
|
|
- 2306 END
|
|
|
- 2307 END; .) .
|
|
|
- 2308 GetIdent<VAR n: SymTab.Name>
|
|
|
- 2309 = ident (. LexName(n); .) .
|
|
|
- 2310
|
|
|
- 2311 END M2.
|
|
|
+ 2208 ELSIF (c1 = SymTab.ClPtr)
|
|
|
+ 2209 AND (c2 = SymTab.ClPtr) THEN
|
|
|
+ 2210 t := vt
|
|
|
+ 2211 ELSIF (c1 = SymTab.ClReal)
|
|
|
+ 2212 AND (c2 = SymTab.ClReal) THEN
|
|
|
+ 2213 t := vt
|
|
|
+ 2214 ELSE SemError(230);
|
|
|
+ 2215 t := SymTab.InvalidType
|
|
|
+ 2216 END
|
|
|
+ 2217 END
|
|
|
+ 2218 END; .)
|
|
|
+ 2219 | "(" Expr<et, q> ")" (. t := et; .)
|
|
|
+ 2220 | SetLit<st, sq> (. t := st;
|
|
|
+ 2221 QbeGen.CopyOp(sq, q); .)
|
|
|
+ 2222 | ( "NOT" | "~" ) Fact<t2, q2> (. IF SymTab.BoolCheck(t2) THEN
|
|
|
+ 2223 t := SymTab.BoolType()
|
|
|
+ 2224 ELSE SemError(212);
|
|
|
+ 2225 t := SymTab.InvalidType END;
|
|
|
+ 2226 IF t # SymTab.InvalidType THEN
|
|
|
+ 2227 QbeGen.NotQ(q2, q)
|
|
|
+ 2228 ELSE QbeGen.CopyOp("0", q)
|
|
|
+ 2229 END; .) .
|
|
|
+ 2230 (* Set literals are SET OF [0..255] (8 words); elements validated
|
|
|
+ 2231 0..255 statically when foldable (222 otherwise), runtime trap
|
|
|
+ 2232 for computed elements. Ranges always lower via SetRange. *)
|
|
|
+ 2233 SetLit<VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
+ 2234 = "{" (. t := SymTab.NewSet(
|
|
|
+ 2235 SymTab.NewSubR(0, 255));
|
|
|
+ 2236 QbeGen.NewSetTemp(8, q);
|
|
|
+ 2237 QbeGen.SetZero(q, 8); .)
|
|
|
+ 2238 [ SetElem<t, q> { "," SetElem<t, q> } ]
|
|
|
+ 2239 "}" .
|
|
|
+ 2240 (* Typed set constructor: TypeName{ elems } — e.g. BITSET{0},
|
|
|
+ 2241 BITSET{}. The declared type (not SET OF [0..255]) sets the
|
|
|
+ 2242 width and element span. *)
|
|
|
+ 2243 TypedSetLit<vt: SymTab.TypeIndex; VAR q: QbeGen.QVal>
|
|
|
+ 2244 (. VAR nw: CARDINAL; .)
|
|
|
+ 2245 = "{" (. IF SymTab.ClassOf(vt) #
|
|
|
+ 2246 SymTab.ClSet THEN
|
|
|
+ 2247 SemError(230); nw := 8
|
|
|
+ 2248 ELSE nw := SymTab.SetWords(vt);
|
|
|
+ 2249 IF nw = 0 THEN nw := 8 END
|
|
|
+ 2250 END;
|
|
|
+ 2251 QbeGen.NewSetTemp(nw, q);
|
|
|
+ 2252 QbeGen.SetZero(q, nw); .)
|
|
|
+ 2253 [ SetElem<vt, q> { "," SetElem<vt, q> } ]
|
|
|
+ 2254 "}" .
|
|
|
+ 2255 SetElem<st: SymTab.TypeIndex; sq: QbeGen.QVal> (. VAR et, et2: SymTab.TypeIndex;
|
|
|
+ 2256 qe, q2: QbeGen.QVal;
|
|
|
+ 2257 v, v2: INTEGER;
|
|
|
+ 2258 lo: INTEGER;
|
|
|
+ 2259 span: CARDINAL;
|
|
|
+ 2260 cl, cl2: INTEGER;
|
|
|
+ 2261 hasR: BOOLEAN; .)
|
|
|
+ 2262 = (. hasR := FALSE; .)
|
|
|
+ 2263 Expr<et, qe>
|
|
|
+ 2264 [ ".." Expr<et2, q2> (. hasR := TRUE; .) ]
|
|
|
+ 2265 (. lo := SymTab.SetBaseLo(st);
|
|
|
+ 2266 span := SymTab.SetCount(st);
|
|
|
+ 2267 IF (et = SymTab.InvalidType)
|
|
|
+ 2268 OR (hasR AND (et2 =
|
|
|
+ 2269 SymTab.InvalidType)) THEN
|
|
|
+ 2270 ELSE cl :=
|
|
|
+ 2271 SymTab.ClassOf(et);
|
|
|
+ 2272 IF hasR THEN
|
|
|
+ 2273 cl2 :=
|
|
|
+ 2274 SymTab.ClassOf(et2)
|
|
|
+ 2275 ELSE cl2 := SymTab.ClInt
|
|
|
+ 2276 END;
|
|
|
+ 2277 IF ((cl # SymTab.ClInt)
|
|
|
+ 2278 AND (cl # SymTab.ClChar)
|
|
|
+ 2279 AND (cl # SymTab.ClBool))
|
|
|
+ 2280 OR (hasR AND
|
|
|
+ 2281 ((cl2
|
|
|
+ 2282 # SymTab.ClInt)
|
|
|
+ 2283 AND (cl2
|
|
|
+ 2284 # SymTab.ClChar)
|
|
|
+ 2285 AND (cl2
|
|
|
+ 2286 # SymTab.ClBool))) THEN
|
|
|
+ 2287 SemError(222)
|
|
|
+ 2288 ELSIF hasR
|
|
|
+ 2289 AND SymTab.ConstInt(qe, v)
|
|
|
+ 2290 AND SymTab.ConstInt(q2,
|
|
|
+ 2291 v2)
|
|
|
+ 2292 AND ((v < lo)
|
|
|
+ 2293 OR (v2 < lo)
|
|
|
+ 2294 OR (v >= lo +
|
|
|
+ 2295 VAL(INTEGER, span))
|
|
|
+ 2296 OR (v2 >= lo +
|
|
|
+ 2297 VAL(INTEGER, span))
|
|
|
+ 2298 OR (v > v2)) THEN
|
|
|
+ 2299 SemError(222)
|
|
|
+ 2300 ELSIF hasR THEN
|
|
|
+ 2301 QbeGen.SetRange(sq, qe, q2,
|
|
|
+ 2302 lo, span)
|
|
|
+ 2303 ELSIF SymTab.ConstInt(qe,
|
|
|
+ 2304 v)
|
|
|
+ 2305 AND ((v < lo)
|
|
|
+ 2306 OR (v >= lo +
|
|
|
+ 2307 VAL(INTEGER,
|
|
|
+ 2308 span))) THEN
|
|
|
+ 2309 SemError(222)
|
|
|
+ 2310 ELSE QbeGen.SetBit(sq, qe,
|
|
|
+ 2311 lo, span)
|
|
|
+ 2312 END
|
|
|
+ 2313 END; .) .
|
|
|
+ 2314 GetIdent<VAR n: SymTab.Name>
|
|
|
+ 2315 = ident (. LexName(n); .) .
|
|
|
+ 2316
|
|
|
+ 2317 END M2.
|
|
|
|
|
|
0 errors
|
|
|
|