factor(y);\r
CheckInt(y);\r
OSG.MulOp(x, y)\r
+\r
ELSIF (op = OSS.div) OR (op = OSS.mod) THEN\r
CheckInt(x);\r
factor(y);\r
CheckInt(y);\r
OSG.DivOp(op, x, y)\r
+\r
ELSE (*op = and*)\r
CheckBool(x);\r
OSG.And1(x);\r
\r
PROCEDURE expression0(VAR x: OSG.Item);\r
VAR y: OSG.Item; op: INTEGER;\r
- BEGIN SimpleExpression(x);\r
+ BEGIN\r
+ SimpleExpression(x);\r
IF (sym >= OSS.eql) & (sym <= OSS.geq) THEN\r
op := sym;\r
OSS.Get(sym);\r
SimpleExpression(y);\r
+\r
IF x.type = y.type THEN\r
OSG.Relation(op, x, y)\r
ELSE\r
// expect(p, IDENT);
// break;
//
-// case '[':
-// expr_list(p);
-// expect(p, ']');
-// break;
+ case '[':
+ {
+ expect(p, '[');
+ Type* type = item->type;
+ while (type && type->form == FORM_ARRAY)
+ {
+ Item expr = {0};
+ expression(p, &expr);
+ check_int(p, &expr);
+ type = type->base;
+ if (type->form == FORM_ARRAY)
+ {
+ expect(p, ',');
+ }
+ }
+ expect(p, ']');
+ break;
+ }
+
//
// case '^':
// expect(p, '^');