|
@@ -2176,131 +2176,131 @@ Listing:
|
|
|
2157 k := SymTab.KindVar;
|
|
2157 k := SymTab.KindVar;
|
|
|
2158 r := SymTab.FwdVarRef(n, k,
|
|
2158 r := SymTab.FwdVarRef(n, k,
|
|
|
2159 fref, t);
|
|
2159 fref, t);
|
|
|
- 2160 Check.NoteForward(fref);
|
|
|
|
|
- 2161 QbeGen.CopyOp("@", q);
|
|
|
|
|
- 2162 sfx := TRUE; fwd := TRUE
|
|
|
|
|
- 2163 ELSE
|
|
|
|
|
- 2164 SemError(201);
|
|
|
|
|
- 2165 t :=
|
|
|
|
|
- 2166 SymTab.InvalidType;
|
|
|
|
|
- 2167 k := -1;
|
|
|
|
|
- 2168 QbeGen.CopyOp("0", q)
|
|
|
|
|
- 2169 END
|
|
|
|
|
- 2170 ELSE
|
|
|
|
|
- 2171 t := SymTab.SymType(n);
|
|
|
|
|
- 2172 k := SymTab.SymKind(n);
|
|
|
|
|
- 2173 IF k = SymTab.KindConst THEN
|
|
|
|
|
- 2174 IF SymTab.Equal(n,
|
|
|
|
|
- 2175 "TRUE") THEN
|
|
|
|
|
- 2176 t := SymTab.BoolType();
|
|
|
|
|
- 2177 QbeGen.CopyOp("1", q)
|
|
|
|
|
- 2178 ELSIF SymTab.Equal(n,
|
|
|
|
|
- 2179 "FALSE") THEN
|
|
|
|
|
- 2180 t := SymTab.BoolType();
|
|
|
|
|
- 2181 QbeGen.CopyOp("0", q)
|
|
|
|
|
- 2182 ELSIF SymTab.Equal(n,
|
|
|
|
|
- 2183 "NIL") THEN
|
|
|
|
|
- 2184 QbeGen.CopyOp("0", q)
|
|
|
|
|
- 2185 ELSE
|
|
|
|
|
- 2186 cls :=
|
|
|
|
|
- 2187 SymTab.ClassOf(t);
|
|
|
|
|
- 2188 IF (t #
|
|
|
|
|
- 2189 SymTab.InvalidType)
|
|
|
|
|
- 2190 AND ((cls = SymTab.ClInt)
|
|
|
|
|
- 2191 OR (cls
|
|
|
|
|
- 2192 = SymTab.ClChar)
|
|
|
|
|
- 2193 OR (cls
|
|
|
|
|
- 2194 = SymTab.ClEnum)
|
|
|
|
|
- 2195 OR (cls
|
|
|
|
|
- 2196 = SymTab.ClReal)
|
|
|
|
|
- 2197 OR (cls
|
|
|
|
|
- 2198 = SymTab.ClLong)
|
|
|
|
|
- 2199 OR (cls
|
|
|
|
|
- 2200 = SymTab.ClNil)) THEN
|
|
|
|
|
- 2201 IF cls = SymTab.ClNil THEN
|
|
|
|
|
- 2202 QbeGen.CopyOp("0", q)
|
|
|
|
|
- 2203 ELSIF ((cls
|
|
|
|
|
- 2204 = SymTab.ClInt)
|
|
|
|
|
- 2205 OR (cls
|
|
|
|
|
- 2206 = SymTab.ClChar)
|
|
|
|
|
- 2207 OR (cls
|
|
|
|
|
- 2208 = SymTab.ClEnum)
|
|
|
|
|
- 2209 OR (cls
|
|
|
|
|
- 2210 = SymTab.ClLong))
|
|
|
|
|
- 2211 AND SymTab.GetSymVal(n, cv)
|
|
|
|
|
- 2212 AND QbeGen.IsImm(cv) THEN
|
|
|
|
|
- 2213 QbeGen.CopyOp(cv, q)
|
|
|
|
|
- 2214 ELSE
|
|
|
|
|
- 2215 QbeGen.LoadVar(n,
|
|
|
|
|
- 2216 cls = SymTab.ClReal,
|
|
|
|
|
- 2217 q)
|
|
|
|
|
- 2218 END
|
|
|
|
|
- 2219 ELSIF (cls = SymTab.ClArray)
|
|
|
|
|
- 2220 OR (cls = SymTab.ClRecord)
|
|
|
|
|
- 2221 OR (cls = SymTab.ClClass)
|
|
|
|
|
- 2222 OR (cls = SymTab.ClStr)
|
|
|
|
|
- 2223 OR (cls = SymTab.ClUStr) THEN
|
|
|
|
|
- 2224 (* aggregate constant:
|
|
|
|
|
- 2225 its value IS the
|
|
|
|
|
- 2226 descriptor address *)
|
|
|
|
|
- 2227 IF SymTab.GetSymVal(n, cv) THEN
|
|
|
|
|
- 2228 QbeGen.CopyOp(cv, q)
|
|
|
|
|
- 2229 ELSE
|
|
|
|
|
- 2230 QbeGen.CopyOp("0", q)
|
|
|
|
|
- 2231 END
|
|
|
|
|
- 2232 ELSE
|
|
|
|
|
- 2233 IF t #
|
|
|
|
|
- 2234 SymTab.InvalidType THEN
|
|
|
|
|
- 2235 SemError(230)
|
|
|
|
|
- 2236 END;
|
|
|
|
|
- 2237 QbeGen.CopyOp("0", q)
|
|
|
|
|
- 2238 END
|
|
|
|
|
- 2239 END
|
|
|
|
|
- 2240 ELSIF (k = SymTab.KindVar)
|
|
|
|
|
- 2241 OR (k = SymTab.KindParam) THEN
|
|
|
|
|
- 2242 cls := SymTab.ClassOf(t);
|
|
|
|
|
- 2243 IF (cls # SymTab.ClInt)
|
|
|
|
|
- 2244 AND (cls # SymTab.ClBool)
|
|
|
|
|
- 2245 AND (cls # SymTab.ClChar)
|
|
|
|
|
- 2246 AND (cls # SymTab.ClUChar)
|
|
|
|
|
- 2247 AND (cls # SymTab.ClEnum)
|
|
|
|
|
- 2248 AND (cls # SymTab.ClReal)
|
|
|
|
|
- 2249 AND (cls # SymTab.ClPtr)
|
|
|
|
|
- 2250 AND (cls # SymTab.ClProc)
|
|
|
|
|
- 2251 AND (cls # SymTab.ClLong)
|
|
|
|
|
- 2252 AND (cls # SymTab.ClArray)
|
|
|
|
|
- 2253 AND (cls # SymTab.ClSet)
|
|
|
|
|
- 2254 AND (cls # SymTab.ClRecord)
|
|
|
|
|
- 2255 AND (cls # SymTab.ClUStr)
|
|
|
|
|
- 2256 AND (cls # SymTab.ClClass) THEN
|
|
|
|
|
- 2257 SemError(230);
|
|
|
|
|
- 2258 QbeGen.CopyOp("0", q)
|
|
|
|
|
- 2259 ELSE QbeGen.CopyOp("@", q)
|
|
|
|
|
- 2260 END
|
|
|
|
|
- 2261 ELSE QbeGen.CopyOp("0", q);
|
|
|
|
|
- 2262 IF k = SymTab.KindImport THEN
|
|
|
|
|
- 2263 SemError(230)
|
|
|
|
|
- 2264 ELSIF k =
|
|
|
|
|
- 2265 SymTab.KindProc THEN
|
|
|
|
|
- 2266 (* bare procedure name:
|
|
|
|
|
- 2267 a following ArgList
|
|
|
|
|
- 2268 makes it a call;
|
|
|
|
|
- 2269 otherwise Fact
|
|
|
|
|
- 2270 reports 230 *)
|
|
|
|
|
- 2271 ELSE
|
|
|
|
|
- 2272 IF k = SymTab.KindField THEN
|
|
|
|
|
- 2273 IF QbeGen.TopWith(qb) THEN
|
|
|
|
|
- 2274 sfx := TRUE
|
|
|
|
|
- 2275 ELSE SemError(230);
|
|
|
|
|
- 2276 QbeGen.CopyOp("0", q)
|
|
|
|
|
- 2277 END
|
|
|
|
|
- 2278 END
|
|
|
|
|
- 2279 END
|
|
|
|
|
- 2280 END
|
|
|
|
|
- 2281 END; .)
|
|
|
|
|
- 2282 (. astDes := AST.MakeNode(AST.NkDesignator);
|
|
|
|
|
- 2283 AST.SetChild(astDes, AST.NChild(astDes), AST.MakeLeaf(AST.NkIdent, n));
|
|
|
|
|
- 2284 IF fwd THEN AST.SetOp(astDes, 1) END; .)
|
|
|
|
|
|
|
+ 2160 QbeGen.CopyOp("@", q);
|
|
|
|
|
+ 2161 sfx := TRUE; fwd := TRUE
|
|
|
|
|
+ 2162 ELSE
|
|
|
|
|
+ 2163 SemError(201);
|
|
|
|
|
+ 2164 t :=
|
|
|
|
|
+ 2165 SymTab.InvalidType;
|
|
|
|
|
+ 2166 k := -1;
|
|
|
|
|
+ 2167 QbeGen.CopyOp("0", q)
|
|
|
|
|
+ 2168 END
|
|
|
|
|
+ 2169 ELSE
|
|
|
|
|
+ 2170 t := SymTab.SymType(n);
|
|
|
|
|
+ 2171 k := SymTab.SymKind(n);
|
|
|
|
|
+ 2172 IF k = SymTab.KindConst THEN
|
|
|
|
|
+ 2173 IF SymTab.Equal(n,
|
|
|
|
|
+ 2174 "TRUE") THEN
|
|
|
|
|
+ 2175 t := SymTab.BoolType();
|
|
|
|
|
+ 2176 QbeGen.CopyOp("1", q)
|
|
|
|
|
+ 2177 ELSIF SymTab.Equal(n,
|
|
|
|
|
+ 2178 "FALSE") THEN
|
|
|
|
|
+ 2179 t := SymTab.BoolType();
|
|
|
|
|
+ 2180 QbeGen.CopyOp("0", q)
|
|
|
|
|
+ 2181 ELSIF SymTab.Equal(n,
|
|
|
|
|
+ 2182 "NIL") THEN
|
|
|
|
|
+ 2183 QbeGen.CopyOp("0", q)
|
|
|
|
|
+ 2184 ELSE
|
|
|
|
|
+ 2185 cls :=
|
|
|
|
|
+ 2186 SymTab.ClassOf(t);
|
|
|
|
|
+ 2187 IF (t #
|
|
|
|
|
+ 2188 SymTab.InvalidType)
|
|
|
|
|
+ 2189 AND ((cls = SymTab.ClInt)
|
|
|
|
|
+ 2190 OR (cls
|
|
|
|
|
+ 2191 = SymTab.ClChar)
|
|
|
|
|
+ 2192 OR (cls
|
|
|
|
|
+ 2193 = SymTab.ClEnum)
|
|
|
|
|
+ 2194 OR (cls
|
|
|
|
|
+ 2195 = SymTab.ClReal)
|
|
|
|
|
+ 2196 OR (cls
|
|
|
|
|
+ 2197 = SymTab.ClLong)
|
|
|
|
|
+ 2198 OR (cls
|
|
|
|
|
+ 2199 = SymTab.ClNil)) THEN
|
|
|
|
|
+ 2200 IF cls = SymTab.ClNil THEN
|
|
|
|
|
+ 2201 QbeGen.CopyOp("0", q)
|
|
|
|
|
+ 2202 ELSIF ((cls
|
|
|
|
|
+ 2203 = SymTab.ClInt)
|
|
|
|
|
+ 2204 OR (cls
|
|
|
|
|
+ 2205 = SymTab.ClChar)
|
|
|
|
|
+ 2206 OR (cls
|
|
|
|
|
+ 2207 = SymTab.ClEnum)
|
|
|
|
|
+ 2208 OR (cls
|
|
|
|
|
+ 2209 = SymTab.ClLong))
|
|
|
|
|
+ 2210 AND SymTab.GetSymVal(n, cv)
|
|
|
|
|
+ 2211 AND QbeGen.IsImm(cv) THEN
|
|
|
|
|
+ 2212 QbeGen.CopyOp(cv, q)
|
|
|
|
|
+ 2213 ELSE
|
|
|
|
|
+ 2214 QbeGen.LoadVar(n,
|
|
|
|
|
+ 2215 cls = SymTab.ClReal,
|
|
|
|
|
+ 2216 q)
|
|
|
|
|
+ 2217 END
|
|
|
|
|
+ 2218 ELSIF (cls = SymTab.ClArray)
|
|
|
|
|
+ 2219 OR (cls = SymTab.ClRecord)
|
|
|
|
|
+ 2220 OR (cls = SymTab.ClClass)
|
|
|
|
|
+ 2221 OR (cls = SymTab.ClStr)
|
|
|
|
|
+ 2222 OR (cls = SymTab.ClUStr) THEN
|
|
|
|
|
+ 2223 (* aggregate constant:
|
|
|
|
|
+ 2224 its value IS the
|
|
|
|
|
+ 2225 descriptor address *)
|
|
|
|
|
+ 2226 IF SymTab.GetSymVal(n, cv) THEN
|
|
|
|
|
+ 2227 QbeGen.CopyOp(cv, q)
|
|
|
|
|
+ 2228 ELSE
|
|
|
|
|
+ 2229 QbeGen.CopyOp("0", q)
|
|
|
|
|
+ 2230 END
|
|
|
|
|
+ 2231 ELSE
|
|
|
|
|
+ 2232 IF t #
|
|
|
|
|
+ 2233 SymTab.InvalidType THEN
|
|
|
|
|
+ 2234 SemError(230)
|
|
|
|
|
+ 2235 END;
|
|
|
|
|
+ 2236 QbeGen.CopyOp("0", q)
|
|
|
|
|
+ 2237 END
|
|
|
|
|
+ 2238 END
|
|
|
|
|
+ 2239 ELSIF (k = SymTab.KindVar)
|
|
|
|
|
+ 2240 OR (k = SymTab.KindParam) THEN
|
|
|
|
|
+ 2241 cls := SymTab.ClassOf(t);
|
|
|
|
|
+ 2242 IF (cls # SymTab.ClInt)
|
|
|
|
|
+ 2243 AND (cls # SymTab.ClBool)
|
|
|
|
|
+ 2244 AND (cls # SymTab.ClChar)
|
|
|
|
|
+ 2245 AND (cls # SymTab.ClUChar)
|
|
|
|
|
+ 2246 AND (cls # SymTab.ClEnum)
|
|
|
|
|
+ 2247 AND (cls # SymTab.ClReal)
|
|
|
|
|
+ 2248 AND (cls # SymTab.ClPtr)
|
|
|
|
|
+ 2249 AND (cls # SymTab.ClProc)
|
|
|
|
|
+ 2250 AND (cls # SymTab.ClLong)
|
|
|
|
|
+ 2251 AND (cls # SymTab.ClArray)
|
|
|
|
|
+ 2252 AND (cls # SymTab.ClSet)
|
|
|
|
|
+ 2253 AND (cls # SymTab.ClRecord)
|
|
|
|
|
+ 2254 AND (cls # SymTab.ClUStr)
|
|
|
|
|
+ 2255 AND (cls # SymTab.ClClass) THEN
|
|
|
|
|
+ 2256 SemError(230);
|
|
|
|
|
+ 2257 QbeGen.CopyOp("0", q)
|
|
|
|
|
+ 2258 ELSE QbeGen.CopyOp("@", q)
|
|
|
|
|
+ 2259 END
|
|
|
|
|
+ 2260 ELSE QbeGen.CopyOp("0", q);
|
|
|
|
|
+ 2261 IF k = SymTab.KindImport THEN
|
|
|
|
|
+ 2262 SemError(230)
|
|
|
|
|
+ 2263 ELSIF k =
|
|
|
|
|
+ 2264 SymTab.KindProc THEN
|
|
|
|
|
+ 2265 (* bare procedure name:
|
|
|
|
|
+ 2266 a following ArgList
|
|
|
|
|
+ 2267 makes it a call;
|
|
|
|
|
+ 2268 otherwise Fact
|
|
|
|
|
+ 2269 reports 230 *)
|
|
|
|
|
+ 2270 ELSE
|
|
|
|
|
+ 2271 IF k = SymTab.KindField THEN
|
|
|
|
|
+ 2272 IF QbeGen.TopWith(qb) THEN
|
|
|
|
|
+ 2273 sfx := TRUE
|
|
|
|
|
+ 2274 ELSE SemError(230);
|
|
|
|
|
+ 2275 QbeGen.CopyOp("0", q)
|
|
|
|
|
+ 2276 END
|
|
|
|
|
+ 2277 END
|
|
|
|
|
+ 2278 END
|
|
|
|
|
+ 2279 END
|
|
|
|
|
+ 2280 END; .)
|
|
|
|
|
+ 2281 (. astDes := AST.MakeNode(AST.NkDesignator);
|
|
|
|
|
+ 2282 AST.SetChild(astDes, AST.NChild(astDes), AST.MakeLeaf(AST.NkIdent, n));
|
|
|
|
|
+ 2283 IF fwd THEN AST.SetOp(astDes, 1) END;
|
|
|
|
|
+ 2284 IF fwd THEN Check.NoteForward(fref, astDes) END; .)
|
|
|
2285 { "[" Expr<it, iq>
|
|
2285 { "[" Expr<it, iq>
|
|
|
2286 (. AST.SetChild(astDes, AST.NChild(astDes),
|
|
2286 (. AST.SetChild(astDes, AST.NChild(astDes),
|
|
|
2287 AST.MakeUn(AST.NkSelector, AST.SelIndex, astCur)); IF t = SymTab.InvalidType THEN
|
|
2287 AST.MakeUn(AST.NkSelector, AST.SelIndex, astCur)); IF t = SymTab.InvalidType THEN
|