|
@@ -1,4 +1,4 @@
|
|
|
-MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.11.2014*)
|
|
|
+MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 25.2.2015 for RISC (LSCX)*)
|
|
|
IMPORT Texts, Oberon, LSB, LSS;
|
|
|
|
|
|
VAR sym: INTEGER;
|
|
@@ -93,7 +93,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.11.2014*)
|
|
|
|
|
|
PROCEDURE selector(VAR x: LSB.Item);
|
|
|
VAR y, z: LSB.Item; obj: LSB.Object;
|
|
|
- eltyp: LSB.Type; len: LONGINT;
|
|
|
+ eltyp: LSB.Type; len, kind: LONGINT;
|
|
|
BEGIN
|
|
|
WHILE (sym = LSS.lbrak) OR (sym = LSS.period) DO
|
|
|
IF sym = LSS.lbrak THEN
|
|
@@ -103,12 +103,12 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.11.2014*)
|
|
|
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 x := New(LSB.sel, x, y); x.type := eltyp
|
|
|
+ ELSE kind := x.val; x := New(LSB.sel, x, y); x.type := eltyp; x.val := kind
|
|
|
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; x := New(LSB.sel, x, y); x.type := eltyp
|
|
|
+ eltyp := x.type(LSB.ArrayType).eltyp; kind := x.val; x := New(LSB.sel, x, y); x.type := eltyp; x.val := kind
|
|
|
END
|
|
|
END
|
|
|
END selector;
|
|
@@ -255,9 +255,8 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.11.2014*)
|
|
|
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 # 3 THEN (*actual param is expression?*) LSS.Mark("bad actual param")
|
|
|
+ IF ~(y.tag IN {3, 7}) THEN (*actual param is expression?*) LSS.Mark("bad actual param")
|
|
|
ELSIF y.b = NIL THEN y.b := undef
|
|
|
- ELSE LSS.Mark("mult def")
|
|
|
END
|
|
|
END
|
|
|
END Param;
|
|
@@ -273,11 +272,9 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.11.2014*)
|
|
|
x := ThisObj(LSS.id); z := x; LSS.Get(sym); selector(z);
|
|
|
IF sym = LSS.becomes THEN LSS.Get(sym);
|
|
|
IF x.val >= 5 THEN LSS.Mark("assignment to read-only") END ;
|
|
|
- IF x.b # NIL THEN LSS.Mark("mult assign") 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
|
|
|
- IF x.val = 0 THEN x.a := z.b ELSE LSS.Mark("illegal assignment") END
|
|
|
- END
|
|
|
+ IF z # x THEN x.a := z.b; x.val := 1 (*overwriting clk field x.a *) 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;
|
|
@@ -395,7 +392,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.11.2014*)
|
|
|
IF x IS LSB.Object THEN
|
|
|
IF (x.tag = LSB.var) & (x.val >= 2) THEN (*not reg*)
|
|
|
IF x(LSB.Object).marked THEN (*loop*)
|
|
|
- Texts.WriteString(W, x(LSB.Object).name); Texts.Write(W, "|"); err := TRUE (*global*)
|
|
|
+ Texts.WriteString(W, x(LSB.Object).name); Texts.Write(W, " "); err := TRUE
|
|
|
ELSIF x.b # NIL THEN x(LSB.Object).marked := TRUE; Traverse(x.b)
|
|
|
END ;
|
|
|
x(LSB.Object).marked := FALSE
|
|
@@ -407,7 +404,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.11.2014*)
|
|
|
|
|
|
PROCEDURE Unit0(VAR locals: LSB.Object);
|
|
|
VAR obj, oldtop: LSB.Object; kind: INTEGER; clock: LSB.Item;
|
|
|
- BEGIN oldtop := top.next; top.next := LSB.top; (*top is dummy*)
|
|
|
+ BEGIN oldtop := top.next; top.next := LSB.root; (*top is dummy*)
|
|
|
IF sym = LSS.lparen THEN LSS.Get(sym) ELSE LSS.Mark("lparen ?") END ;
|
|
|
WHILE (sym = LSS.in) OR (sym = LSS.out) OR (sym = LSS.inout) DO ParamList END ;
|
|
|
IF sym = LSS.rparen THEN LSS.Get(sym) ELSE LSS.Mark("rparen ?") END ;
|
|
@@ -420,24 +417,24 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.11.2014*)
|
|
|
IF sym = LSS.type THEN LSS.Get(sym);
|
|
|
WHILE sym = LSS.ident DO TypeDeclaration END
|
|
|
END ;
|
|
|
- WHILE sym = LSS.var DO LSS.Get(sym);
|
|
|
- WHILE sym = LSS.ident DO VarList(2, NIL) END
|
|
|
- END ;
|
|
|
- WHILE sym = LSS.reg DO LSS.Get(sym);
|
|
|
- IF sym = LSS.lparen THEN (*clock*)
|
|
|
- LSS.Get(sym); kind := 1; expression(clock);
|
|
|
- IF sym = LSS.rparen THEN LSS.Get(sym) ELSE LSS.Mark("rparen ?") END
|
|
|
- ELSE kind := 0; clock := NIL
|
|
|
- END ;
|
|
|
- WHILE sym = LSS.ident DO VarList(kind, clock) END
|
|
|
- END ;
|
|
|
- WHILE sym = LSS.var DO LSS.Get(sym);
|
|
|
- WHILE sym = LSS.ident DO VarList(2, NIL) END
|
|
|
+ WHILE (sym = LSS.var) OR (sym = LSS.reg) DO
|
|
|
+ IF sym = LSS.var THEN LSS.Get(sym);
|
|
|
+ WHILE sym = LSS.ident DO VarList(2, NIL) END
|
|
|
+ ELSE (*reg*) kind := 0; LSS.Get(sym);
|
|
|
+ IF sym = LSS.lparen THEN (*clock*)
|
|
|
+ LSS.Get(sym); expression(clock);
|
|
|
+ IF clock.type # LSB.bitType THEN LSS.Mark("clock must be bitType") END ;
|
|
|
+ IF (clock IS LSB.Object) & (clock(LSB.Object).name = "clk") THEN kind := 1; clock := NIL END ;
|
|
|
+ IF sym = LSS.rparen THEN LSS.Get(sym) ELSE LSS.Mark("rparen ?") END
|
|
|
+ ELSE LSS.Mark("lparen expected"); clock := undef
|
|
|
+ END ;
|
|
|
+ WHILE sym = LSS.ident DO VarList(kind, clock) END
|
|
|
+ END
|
|
|
END ;
|
|
|
locals := top.next;
|
|
|
IF sym = LSS.begin THEN LSS.Get(sym); StatSequence END ;
|
|
|
obj := locals; err := FALSE; (*find unassigned variables*)
|
|
|
- WHILE obj # LSB.top DO
|
|
|
+ WHILE obj # LSB.root DO
|
|
|
IF (obj.tag = LSB.var) & (obj.val < 5) THEN
|
|
|
IF (obj.b = NIL) & (obj.val < 4) THEN Texts.WriteString(W, obj.name); Texts.Write(W, " "); err := TRUE
|
|
|
ELSIF obj.b = undef THEN obj.b := NIL
|
|
@@ -445,21 +442,23 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.11.2014*)
|
|
|
END ;
|
|
|
obj := obj.next
|
|
|
END ;
|
|
|
- IF err THEN LSS.Mark(" unassigned variables") END ;
|
|
|
- obj := locals; err := FALSE; (*find combinatorial loops*)
|
|
|
- WHILE obj # LSB.top DO
|
|
|
- IF obj.tag = LSB.var THEN obj.marked := TRUE; Traverse(obj.b); obj.marked := FALSE END ;
|
|
|
- obj := obj.next
|
|
|
- END ;
|
|
|
- IF err THEN Texts.WriteLn(W); Texts.WriteString(W, " variables in comb. loops") END
|
|
|
+ IF err THEN Texts.WriteString(W, " unassigned"); Texts.WriteLn(W)
|
|
|
+ ELSE obj := locals; err := FALSE; (*find combinatorial loops*)
|
|
|
+ WHILE obj # LSB.root DO
|
|
|
+ IF obj.tag = LSB.var THEN obj.marked := TRUE; Traverse(obj.b); obj.marked := FALSE END ;
|
|
|
+ obj := obj.next
|
|
|
+ END ;
|
|
|
+ IF err THEN Texts.WriteString(W, "in loop"); Texts.WriteLn(W) END
|
|
|
+ END
|
|
|
END ;
|
|
|
+ IF err THEN Texts.Append(Oberon.Log, W.buf) END ;
|
|
|
top.next := oldtop
|
|
|
END Unit0;
|
|
|
|
|
|
PROCEDURE Module(T: Texts.Text; pos: LONGINT);
|
|
|
VAR root: LSB.Object; modname: ARRAY 32 OF CHAR;
|
|
|
- BEGIN Texts.WriteString(W, "compiling Lola ");
|
|
|
- bot := LSB.top; top.next := bot; LSS.Init(T, pos); LSS.Get(sym);
|
|
|
+ BEGIN Texts.WriteString(W, "compiling Lola: ");
|
|
|
+ bot := LSB.root; top.next := bot; LSS.Init(T, pos); LSS.Get(sym);
|
|
|
IF sym = LSS.module THEN
|
|
|
LSS.Get(sym);
|
|
|
IF sym = LSS.ident THEN
|
|
@@ -467,12 +466,14 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.11.2014*)
|
|
|
Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);
|
|
|
ELSE LSS.Mark("ident ?")
|
|
|
END ;
|
|
|
- Unit(root); LSB.Record(modname, root);
|
|
|
+ Unit(root);
|
|
|
IF sym = LSS.ident THEN LSS.Get(sym);
|
|
|
IF LSS.id # modname THEN LSS.Mark("no match") END
|
|
|
END ;
|
|
|
IF sym # LSS.period THEN LSS.Mark("period ?") END ;
|
|
|
- IF LSS.error THEN Texts.WriteString(W, "compilation failed"); Texts.WriteLn(W) END
|
|
|
+ IF ~LSS.error THEN LSB.Register(modname, root)
|
|
|
+ ELSE Texts.WriteString(W, "compilation failed"); Texts.WriteLn(W); LSB.Register("", LSB.root)
|
|
|
+ END
|
|
|
ELSE LSS.Mark("module ?")
|
|
|
END ;
|
|
|
Texts.Append(Oberon.Log, W.buf)
|
|
@@ -495,7 +496,7 @@ MODULE LSC; (*Lola System Compiler, NW 8.1.95 / 18.11.2014*)
|
|
|
END Compile;
|
|
|
|
|
|
BEGIN Texts.OpenWriter(W);
|
|
|
- Texts.WriteString(W, "Lola compiler; NW 18.11.2014"); Texts.WriteLn(W);
|
|
|
- NEW(top); bot := LSB.top; NEW(undef); undef.tag := 2; undef.type := LSB.bitType;
|
|
|
+ Texts.WriteString(W, "Lola compiler; NW 20.2.2015"); Texts.WriteLn(W);
|
|
|
+ NEW(top); bot := LSB.root; NEW(undef); undef.tag := 2; undef.type := LSB.bitType;
|
|
|
factor := factor0; expression := expression0; Unit := Unit0
|
|
|
END LSC.
|