|
@@ -1,14 +1,25 @@
|
|
|
-MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
+MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 28.10.2016*)
|
|
|
IMPORT Texts, Oberon, LSB, LSS;
|
|
|
|
|
|
VAR sym: INTEGER;
|
|
|
err: BOOLEAN; (*used at end of Unit*)
|
|
|
top, bot, undef: LSB.Object;
|
|
|
- factor: PROCEDURE (VAR x: LSB.Item); (*to avoid forward references*)
|
|
|
- expression: PROCEDURE (VAR x: LSB.Item);
|
|
|
- Unit: PROCEDURE (VAR locals: LSB.Object);
|
|
|
W: Texts.Writer;
|
|
|
|
|
|
+ PROCEDURE Out(n: INTEGER);
|
|
|
+ BEGIN Texts.Write(W, "\"); Texts.WriteInt(W, n, 4); Texts.Append(Oberon.Log, W.buf)
|
|
|
+ END Out;
|
|
|
+
|
|
|
+ PROCEDURE WrTyp(t: LSB.Type);
|
|
|
+ BEGIN
|
|
|
+ IF t = LSB.integer THEN Texts.Write(W, "N"); Texts.WriteInt(W, t.size, 4)
|
|
|
+ ELSIF t = LSB.string THEN Texts.Write(W, "S"); Texts.WriteInt(W, t.size, 4)
|
|
|
+ ELSIF t = LSB.bitType THEN Texts.Write(W, "B")
|
|
|
+ ELSIF t IS LSB.ArrayType THEN Texts.Write(W, "A"); WrTyp(t(LSB.ArrayType).eltyp)
|
|
|
+ END ;
|
|
|
+ Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
|
|
|
+ END WrTyp;
|
|
|
+
|
|
|
PROCEDURE Err(n: INTEGER);
|
|
|
BEGIN LSS.Mark("type error"); Texts.WriteInt(W, n, 4);
|
|
|
Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
|
|
@@ -31,7 +42,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
BEGIN x := top;
|
|
|
WHILE (x.next # bot) & (x.next.name # LSS.id) DO x := x.next END ;
|
|
|
IF x.next = bot THEN
|
|
|
- NEW(new); new.name := LSS.id; new.tag := class; new.next := bot; x.next := new
|
|
|
+ NEW(new); COPY(LSS.id, new.name); new.tag := class; new.next := bot; x.next := new
|
|
|
ELSE LSS.Mark("mult def"); new := x
|
|
|
END ;
|
|
|
RETURN new
|
|
@@ -48,7 +59,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
PROCEDURE CheckTypes(x, y, z: LSB.Item); (*z.type = result type*)
|
|
|
VAR xtyp, ytyp: LSB.Type;
|
|
|
BEGIN xtyp := x.type; ytyp := y.type; z.type := xtyp; z.size := x.size; z.val := x.val;
|
|
|
- IF xtyp = LSB.bitType THEN z.type := xtyp;
|
|
|
+ IF xtyp = LSB.bitType THEN
|
|
|
IF ytyp = LSB.integer THEN (* b + 0 *)
|
|
|
IF y.val >= 2 THEN Err(20); LSS.Mark("only 0 or 1") END
|
|
|
ELSIF ytyp = LSB.string THEN (* b + {...} *) Err(21)
|
|
@@ -62,7 +73,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
IF xtyp.size < Log(y.val) THEN Err(30) END
|
|
|
ELSIF ytyp = LSB.string THEN (*x + {...} *)
|
|
|
IF xtyp.size # y.size THEN Err(31) END
|
|
|
- ELSIF ytyp # LSB.bitType THEN Err(34)
|
|
|
+ ELSE Err(34)
|
|
|
END
|
|
|
ELSIF (ytyp IS LSB.ArrayType) & (xtyp(LSB.ArrayType).eltyp = ytyp(LSB.ArrayType).eltyp) THEN
|
|
|
IF (xtyp.size # ytyp.size) THEN Err(40) END
|
|
@@ -91,6 +102,8 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
END
|
|
|
END CheckTypes;
|
|
|
|
|
|
+ PROCEDURE ^ expression(VAR x: LSB.Item);
|
|
|
+
|
|
|
PROCEDURE selector(VAR x: LSB.Item);
|
|
|
VAR y, z: LSB.Item; obj: LSB.Object;
|
|
|
eltyp: LSB.Type; len, kind: LONGINT;
|
|
@@ -103,12 +116,14 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
IF (y.tag = LSB.lit) & (z.tag = LSB.lit) THEN
|
|
|
len := y.val - z.val + 1; y := New(LSB.range, y, z); x := New(LSB.sel, x, y); x.type := LSB.string; x.size := len
|
|
|
END
|
|
|
- ELSE kind := x.val; x := New(LSB.sel, x, y); x.type := eltyp; x.val := kind
|
|
|
+ ELSE x := New(LSB.sel, x, y); x.type := eltyp
|
|
|
END ;
|
|
|
IF sym = LSS.rbrak THEN LSS.Get(sym) ELSE LSS.Mark("rbrak ?") END
|
|
|
ELSE (*sym = LSS.period*) LSS.Get(sym); factor(y);
|
|
|
IF (y.tag = LSB.lit) & (y.val >= x.type.len) THEN LSS.Mark("too large") END ;
|
|
|
- eltyp := x.type(LSB.ArrayType).eltyp; kind := x.val; x := New(LSB.sel, x, y); x.type := eltyp; x.val := kind
|
|
|
+ (*Texts.WriteString(W, "Sel"); Texts.WriteInt(W, x.tag, 4); Texts.WriteInt(W, x.val, 4);*)
|
|
|
+ eltyp := x.type(LSB.ArrayType).eltyp; kind := x.val; x := New(LSB.sel, x, y); x.type := eltyp; x.val := kind;
|
|
|
+ (*Texts.WriteInt(W, x.tag, 4); Texts.WriteInt(W, x.val, 4); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);*)
|
|
|
END
|
|
|
END
|
|
|
END selector;
|
|
@@ -138,7 +153,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
IF sym = LSS.rbrace THEN LSS.Get(sym) ELSE LSS.Mark("rbrace ?") END
|
|
|
END constructor;
|
|
|
|
|
|
- PROCEDURE factor0(VAR x: LSB.Item);
|
|
|
+ PROCEDURE factor(VAR x: LSB.Item);
|
|
|
VAR obj: LSB.Object; y, z: LSB.Item;
|
|
|
n, len: LONGINT; t: LSB.ArrayType;
|
|
|
BEGIN
|
|
@@ -158,8 +173,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
len := LSS.val; LSS.Get(sym);
|
|
|
IF len < Log(x.val) THEN LSS.Mark("value too large") END
|
|
|
ELSE LSS.Mark("integer ?"); len := 0
|
|
|
- END ;
|
|
|
- x.size := len
|
|
|
+ END
|
|
|
ELSE len := 0
|
|
|
END ;
|
|
|
x.size := len
|
|
@@ -168,7 +182,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
ELSIF sym = LSS.lbrace THEN LSS.Get(sym); constructor(x)
|
|
|
ELSE LSS.Mark("bad factor")
|
|
|
END
|
|
|
- END factor0;
|
|
|
+ END factor;
|
|
|
|
|
|
PROCEDURE term(VAR x: LSB.Item);
|
|
|
VAR y, z: LSB.Item; op: INTEGER;
|
|
@@ -217,7 +231,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
END
|
|
|
END UncondExpression;
|
|
|
|
|
|
- PROCEDURE expression0(VAR x: LSB.Item);
|
|
|
+ PROCEDURE expression(VAR x: LSB.Item);
|
|
|
VAR y, z, w: LSB.Item;
|
|
|
BEGIN UncondExpression(x);
|
|
|
IF sym = LSS.then THEN
|
|
@@ -229,7 +243,12 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
ELSE LSS.Mark("colon ?")
|
|
|
END
|
|
|
END
|
|
|
- END expression0;
|
|
|
+ END expression;
|
|
|
+
|
|
|
+ PROCEDURE WritePars(fpar: LSB.Object; apar: LSB.Item);
|
|
|
+ BEGIN Texts.Write(W, 9X); Texts.WriteString(W, fpar.name); Texts.Write(W, "\");
|
|
|
+ IF apar IS LSB.Object THEN Texts.WriteString(W, apar(LSB.Object).name) END
|
|
|
+ END WritePars;
|
|
|
|
|
|
PROCEDURE CheckAssign(x, y: LSB.Item);
|
|
|
VAR xtyp, ytyp: LSB.Type;
|
|
@@ -257,15 +276,16 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
VAR y, z: LSB.Item;
|
|
|
BEGIN expression(y); apar := New(LSB.next, NIL, y); CheckAssign(fpar, y);
|
|
|
IF fpar.val IN {3, 4} THEN (*OUT or INOUT parameter*)
|
|
|
- IF ~(y.tag IN {3, 7}) THEN (*actual param is expression?*) LSS.Mark("bad actual param")
|
|
|
+ (* Texts.WriteString(W, "Param"); Texts.WriteInt(W, fpar.val, 4); Texts.WriteInt(W, y.val, 4); Texts.WriteInt(W, y.tag, 4); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); *)
|
|
|
+ IF (*y.tag # 3*) ~(y.tag IN {3, 7}) THEN (*actual param is expression?*) LSS.Mark("bad actual param");
|
|
|
ELSIF y.b = NIL THEN y.b := undef
|
|
|
END
|
|
|
END
|
|
|
END Param;
|
|
|
|
|
|
PROCEDURE Statement;
|
|
|
- VAR x, y, z, apar, npar: LSB.Item;
|
|
|
- unit: LSB.UnitType; fpar: LSB.Object;
|
|
|
+ VAR x, y, z, w, apar, npar: LSB.Item;
|
|
|
+ unit: LSB.UnitType; fpar: LSB.Object;
|
|
|
BEGIN
|
|
|
IF sym < LSS.ident THEN LSS.Mark("bad factor");
|
|
|
REPEAT LSS.Get(sym) UNTIL sym >= LSS.ident
|
|
@@ -276,7 +296,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
IF x.val >= 5 THEN LSS.Mark("assignment to read-only") END ;
|
|
|
IF (x.b # NIL) & ~(x.type IS LSB.ArrayType) THEN LSS.Mark("mult assign") END ;
|
|
|
expression(y); CheckAssign(z, y); x.b := y; (*tricky*)
|
|
|
- IF z # x THEN x.a := z.b; x.val := 1 (*overwriting clk field x.a *) END
|
|
|
+ IF z # x THEN x.a := z.b; x.val := 1 (*overwriting clk field x.a with index*) END
|
|
|
ELSIF sym = LSS.lparen THEN LSS.Get(sym); (*unit instantiation*)
|
|
|
IF x.type IS LSB.UnitType THEN
|
|
|
unit := x.type(LSB.UnitType); fpar := unit.firstobj;
|
|
@@ -321,6 +341,9 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
PROCEDURE StatSequence;
|
|
|
BEGIN Statement;
|
|
|
WHILE sym <= LSS.semicolon DO
|
|
|
+ (* IF sym = LSS.semicolon THEN LSS.Get(sym)
|
|
|
+ ELSIF sym < LSS.semicolon THEN LSS.Mark("semicolon missing?");
|
|
|
+ END ; *)
|
|
|
IF sym < LSS.semicolon THEN LSS.Mark("semicolon missing?") END ;
|
|
|
WHILE sym = LSS.semicolon DO LSS.Get(sym) END ;
|
|
|
Statement
|
|
@@ -328,7 +351,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
IF sym = LSS.end THEN LSS.Get(sym) ELSE LSS.Mark("END ?") END
|
|
|
END StatSequence;
|
|
|
|
|
|
- (*---------------------------------------------------*)
|
|
|
+ (*----------------------declarations-----------------------------*)
|
|
|
|
|
|
(* for variables and registers,, obj.val has the meaning
|
|
|
0 register
|
|
@@ -391,10 +414,10 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
VAR first, new, obj: LSB.Object; type: LSB.Type;
|
|
|
BEGIN obj := NIL;
|
|
|
WHILE sym = LSS.ident DO
|
|
|
- new := NewObj(LSB.var); new.name := LSS.id; new.val := kind; first := new; LSS.Get(sym);
|
|
|
+ new := NewObj(LSB.var); COPY(LSS.id, new.name); new.val := kind; first := new; LSS.Get(sym);
|
|
|
IF sym = LSS.comma THEN LSS.Get(sym) ELSIF sym = LSS.ident THEN LSS.Mark("comma missing") END ;
|
|
|
WHILE sym = LSS.ident DO
|
|
|
- new := NewObj(LSB.var); new.name := LSS.id; new.val := kind; LSS.Get(sym);
|
|
|
+ new := NewObj(LSB.var); COPY(LSS.id, new.name); new.val := kind; LSS.Get(sym);
|
|
|
IF sym = LSS.comma THEN LSS.Get(sym) ELSIF sym = LSS.ident THEN LSS.Mark("comma missing") END
|
|
|
END ;
|
|
|
IF sym = LSS.colon THEN
|
|
@@ -419,6 +442,13 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
VarList(kind, NIL)
|
|
|
END ParamList;
|
|
|
|
|
|
+ PROCEDURE List*;
|
|
|
+ VAR obj: LSB.Object;
|
|
|
+ BEGIN obj := top.next;
|
|
|
+ WHILE obj # NIL DO Texts.WriteString(W, obj.name); Texts.Write(W, "|"); obj := obj.next END ;
|
|
|
+ Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
|
|
|
+ END List;
|
|
|
+
|
|
|
PROCEDURE Traverse(x: LSB.Item);
|
|
|
BEGIN
|
|
|
IF x # NIL THEN
|
|
@@ -435,7 +465,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
END
|
|
|
END Traverse;
|
|
|
|
|
|
- PROCEDURE Unit0(VAR locals: LSB.Object);
|
|
|
+ PROCEDURE Unit(VAR locals: LSB.Object);
|
|
|
VAR obj, oldtop: LSB.Object; kind: INTEGER; clock: LSB.Item;
|
|
|
BEGIN oldtop := top.next; top.next := LSB.root; (*top is dummy*)
|
|
|
IF sym = LSS.lparen THEN LSS.Get(sym) ELSE LSS.Mark("lparen ?") END ;
|
|
@@ -464,7 +494,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
WHILE sym = LSS.ident DO VarList(kind, clock) END
|
|
|
END
|
|
|
END ;
|
|
|
- locals := top.next;
|
|
|
+ List; locals := top.next;
|
|
|
IF sym = LSS.begin THEN LSS.Get(sym); StatSequence END ;
|
|
|
obj := locals; err := FALSE; (*find unassigned variables*)
|
|
|
WHILE obj # LSB.root DO
|
|
@@ -486,7 +516,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
END ;
|
|
|
IF err THEN Texts.Append(Oberon.Log, W.buf) END ;
|
|
|
top.next := oldtop
|
|
|
- END Unit0;
|
|
|
+ END Unit;
|
|
|
|
|
|
PROCEDURE Module(T: Texts.Text; pos: LONGINT);
|
|
|
VAR root: LSB.Object; modname: ARRAY 32 OF CHAR;
|
|
@@ -495,7 +525,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
IF sym = LSS.module THEN
|
|
|
LSS.Get(sym);
|
|
|
IF sym = LSS.ident THEN
|
|
|
- modname := LSS.id; Texts.WriteString(W, LSS.id); LSS.Get(sym);
|
|
|
+ COPY(LSS.id, modname); Texts.WriteString(W, LSS.id); LSS.Get(sym);
|
|
|
Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);
|
|
|
ELSE LSS.Mark("ident ?")
|
|
|
END ;
|
|
@@ -529,7 +559,6 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.9.2016 for RISC (LSCX)*)
|
|
|
END Compile;
|
|
|
|
|
|
BEGIN Texts.OpenWriter(W);
|
|
|
- Texts.WriteString(W, "Lola compiler; NW 18.9.2016"); Texts.WriteLn(W);
|
|
|
- factor := factor0; expression := expression0; Unit := Unit0;
|
|
|
+ Texts.WriteString(W, "Lola compiler; NW 28.10.20165"); Texts.WriteLn(W);
|
|
|
NEW(top); bot := LSB.root; NEW(undef); undef.tag := 2; undef.type := LSB.bitType
|
|
|
END LSC.
|