-long A, B;
-
void pos(void) { A = +A; }
void neg(void) { A = -A; }
void bnot(void) { A = ~A; }
void bxor(void) { A = A ^ B; }
+long A, B;
+
+long addi(void) { return A + B; }
+//long addii(void) { return A + 3; }
+
+long subi(void) { return A - B; }
+//long subii(void) { return A - 3; }
+
+long muli(void) { return A * B; }
+//long mulii(void) { return A * 3; }
+
+long divi(void) { return A / B; }
+//long divii(void) { return A / 3; }
+
+long modi(void) { return A % B; }
+//long modii(void) { return A % 3; }
+
+void pop(void) { asm("pop %rax"); }
+void push(void) { asm("push %rax"); }
+
+// call
+// ret
+
+long ldi(void) { return 42; }
+long ldm(void) { return A; }
+void sti(void) { A = 42; }
+void stm(void) { A = B; }
+
END OpenScope;\r
\r
PROCEDURE CloseScope;\r
- BEGIN topScope := topScope.dsc\r
+ BEGIN\r
+ topScope := topScope.dsc\r
END CloseScope;\r
\r
(* -------------------- Parser ---------------------*)\r
END ;\r
Check(OSS.rbrak, "no ]")\r
\r
- ELSE (*period*) OSS.Get(sym);\r
+ ELSE (*period*)\r
+ OSS.Get(sym);\r
IF sym = OSS.ident THEN\r
IF x.type.form = OSG.Record THEN\r
FindField(obj, x.type.dsc); OSS.Get(sym);\r
\r
PROCEDURE Parameter(par: OSG.Object);\r
VAR x: OSG.Item; varpar: BOOLEAN;\r
- BEGIN expression(x);\r
+ BEGIN\r
+ expression(x);\r
IF par # NIL THEN\r
varpar := par.class = OSG.Par;\r
IF CompTypes(par.type, x.type) THEN\r
VAR n: INTEGER; par: OSG.Object;\r
BEGIN par := obj.dsc; n := 0;\r
IF sym # OSS.rparen THEN\r
- Parameter(par); n := 1;\r
+ Parameter(par);\r
+ n := 1;\r
WHILE sym <= OSS.comma DO\r
Check(sym, "comma?");\r
- IF par # NIL THEN par := par.next END ;\r
- INC(n); Parameter(par)\r
+ IF par # NIL THEN\r
+ par := par.next\r
+ END ;\r
+ INC(n);\r
+ Parameter(par)\r
END ;\r
Check(OSS.rparen, ") missing")\r
- ELSE OSS.Get(sym);\r
+ ELSE\r
+ OSS.Get(sym);\r
END ;\r
- IF n < obj.nofpar THEN OSS.Mark("too few params")\r
- ELSIF n > obj.nofpar THEN OSS.Mark("too many params")\r
+ IF n < obj.nofpar THEN\r
+ OSS.Mark("too few params")\r
+ ELSIF n > obj.nofpar THEN\r
+ OSS.Mark("too many params")\r
END\r
END ParamList;\r
\r
IF sym = OSS.rparen THEN OSS.Get(sym) ELSE OSS.Mark("rparen expected") END\r
ELSE OSS.Mark("param missing"); OSG.MakeConstItem(x, OSG.intType, 0)\r
END\r
- END StandFunc;\r
+ END StandF\unc;\r
\r
PROCEDURE factor(VAR x: OSG.Item);\r
VAR obj: OSG.Object;\r
OSS.Mark("expression expected");\r
REPEAT OSS.Get(sym) UNTIL (sym >= OSS.int) & (sym <= OSS.ident)\r
END ;\r
+\r
IF sym = OSS.ident THEN\r
find(obj);\r
OSS.Get(sym);\r
OSG.MakeItem(x, obj, level);\r
selector(x)\r
END\r
+\r
ELSIF sym = OSS.int THEN\r
OSG.MakeConstItem(x, OSG.intType, OSS.val);\r
OSS.Get(sym)\r
+\r
ELSIF sym = OSS.char THEN\r
OSG.MakeConstItem(x, OSG.intType, OSS.val);\r
OSS.Get(sym)\r
+\r
ELSIF sym = OSS.lparen THEN\r
OSS.Get(sym);\r
- IF sym # OSS.rparen THEN expression(x) END ;\r
+ IF sym # OSS.rparen THEN\r
+ expression(x)\r
+ END ;\r
Check(OSS.rparen, "no )")\r
+\r
ELSIF sym = OSS.not THEN\r
OSS.Get(sym);\r
factor(x);\r
CheckBool(x);\r
OSG.Not(x)\r
+\r
ELSIF sym = OSS.false THEN\r
OSS.Get(sym);\r
OSG.MakeConstItem(x, OSG.boolType, 0)\r
+\r
ELSIF sym = OSS.true THEN\r
OSS.Get(sym);\r
OSG.MakeConstItem(x, OSG.boolType, 1)\r
+\r
ELSE\r
OSS.Mark("factor?");\r
OSG.MakeItem(x, dummy, level)\r
END\r
END FPSection;\r
\r
- BEGIN (* ProcedureDecl *) OSS.Get(sym);\r
+ BEGIN (* ProcedureDecl *)\r
+ OSS.Get(sym);\r
IF sym = OSS.ident THEN\r
procid := OSS.id; NewObj(proc, OSG.Proc); OSS.Get(sym); parblksize := marksize; nofpar := 0;\r
(* Texts.Write(W, "%"); Texts.WriteInt(W, sym, 4); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); *)\r