Skip to content

Commit 578dc66

Browse files
authored
Merge pull request #99 from zaskar9/oberon-crash-course
Demo modules for Oberon and LLVM tutorials
2 parents 2a77fa1 + 9ad527c commit 578dc66

7 files changed

Lines changed: 293 additions & 4 deletions

File tree

demo/ETH/Stuetzkurs/List.Mod

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
MODULE List;
2+
IMPORT Out;
3+
4+
TYPE
5+
Object* = POINTER TO ObjectDesc;
6+
ObjectDesc* = RECORD
7+
compare*: PROCEDURE(this, other: Object): INTEGER;
8+
print*: PROCEDURE(this: Object)
9+
END;
10+
Element = POINTER TO ElementDesc;
11+
ElementDesc = RECORD
12+
value: Object;
13+
next: Element
14+
END;
15+
List* = POINTER TO ListDesc;
16+
ListDesc* = RECORD
17+
first, last: Element;
18+
insert*: PROCEDURE(this: List; o: Object);
19+
delete*: PROCEDURE(this: List; o: Object);
20+
print*: PROCEDURE(this: List)
21+
END;
22+
23+
(* Developer-defined types. *)
24+
Integer* = POINTER TO IntegerDesc;
25+
IntegerDesc* = RECORD (ObjectDesc)
26+
value*: INTEGER
27+
END;
28+
29+
VAR
30+
i: INTEGER;
31+
value: Integer;
32+
l: List;
33+
34+
PROCEDURE compareInt(this, other: Object): INTEGER;
35+
BEGIN
36+
RETURN this(Integer).value - other(Integer).value
37+
END compareInt;
38+
39+
PROCEDURE printInt(this: Object);
40+
BEGIN
41+
Out.Int(this(Integer).value, 0)
42+
END printInt;
43+
44+
PROCEDURE newInt(value: INTEGER): Integer;
45+
VAR res: Integer;
46+
BEGIN
47+
NEW(res);
48+
res.value := value;
49+
res.compare := compareInt;
50+
res.print := printInt;
51+
RETURN res
52+
END newInt;
53+
54+
PROCEDURE insert(l: List; o: Object);
55+
VAR e: Element;
56+
BEGIN
57+
NEW(e);
58+
e.value := o;
59+
e.next := NIL;
60+
IF l.first # NIL THEN
61+
l.last.next := e
62+
ELSE
63+
l.first := e
64+
END;
65+
l.last := e
66+
END insert;
67+
68+
PROCEDURE delete(l: List; o: Object);
69+
VAR cur, prev: Element;
70+
val: Object;
71+
BEGIN
72+
cur := l.first;
73+
prev := NIL;
74+
WHILE cur # NIL DO
75+
val := cur.value;
76+
IF val.compare(val, o) = 0 THEN
77+
IF prev # NIL THEN
78+
prev.next := cur.next;
79+
IF cur = l.last THEN
80+
l.last := prev
81+
END
82+
ELSE
83+
l.first := cur.next
84+
END;
85+
DISPOSE(cur.value);
86+
DISPOSE(cur);
87+
EXIT
88+
ELSE
89+
prev := cur;
90+
cur := cur.next
91+
END
92+
END
93+
END delete;
94+
95+
PROCEDURE print(l: List);
96+
VAR cur: Element;
97+
val: Object;
98+
BEGIN
99+
cur := l.first;
100+
Out.Char("[");
101+
WHILE cur # NIL DO
102+
val := cur.value;
103+
val.print(val);
104+
cur := cur.next;
105+
IF (cur # NIL) THEN Out.Char(",") END
106+
END;
107+
Out.Char("]")
108+
END print;
109+
110+
PROCEDURE newList*(): List;
111+
VAR l: List;
112+
BEGIN
113+
NEW(l);
114+
l.first := NIL; l.last := NIL;
115+
l.insert := insert;
116+
l.delete := delete;
117+
l.print := print;
118+
RETURN l
119+
END newList;
120+
121+
PROCEDURE deleteList*(l: List);
122+
VAR cur, tmp: Element;
123+
BEGIN
124+
cur := l.first;
125+
WHILE cur # NIL DO
126+
tmp := cur;
127+
cur := cur.next;
128+
DISPOSE(tmp.value);
129+
DISPOSE(tmp)
130+
END;
131+
DISPOSE(l)
132+
END deleteList;
133+
134+
BEGIN
135+
l := newList();
136+
l.print(l); Out.Ln;
137+
FOR i := 0 TO 9 DO
138+
l.insert(l, newInt(i))
139+
END;
140+
l.print(l); Out.Ln;
141+
l.delete(l, newInt(0));
142+
l.delete(l, newInt(5));
143+
l.delete(l, newInt(9));
144+
l.print(l); Out.Ln;
145+
deleteList(l)
146+
END List.

demo/ETH/Stuetzkurs/RealScanner.Mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ IMPORT In, Out, Reals;
2424
ch: CHAR;
2525
valid: BOOLEAN;
2626
BEGIN
27-
val := 0; i := 0; s := 0; div := 1; scale := 0; valid := TRUE;
27+
val := 0; i := 0; s := 0; div := 1; scale := 0 valid := TRUE;
2828
WHILE valid & (i < LEN(str)) & (str[i] # 0X) DO
2929
ch := str[i]; INC(i);
3030
CASE s OF
3131
0 : IF isDigit(ch) THEN
32-
s := 1;
32+
s := 1
3333
val := 10 * val + ctoi(ch)
3434
ELSE
3535
valid := FALSE

demo/ETH/Stuetzkurs/Temperatur.Mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ MODULE Temperatur;
7171
IF (von > nach) OR (schritt > (nach - von)) THEN
7272
Out.String("Gib mir doch eine Eingabe, die Sinn macht!"); Out.Ln;
7373
ELSE
74-
WHILE von < nach DO
74+
WHILE von <= nach DO
7575
Out.Int(von,5); Out.String(" -> ");
7676
Out.RealFix(CtoF(von),3,2); Out.Ln;
7777
von := von + schritt;
@@ -98,7 +98,7 @@ MODULE Temperatur;
9898

9999
BEGIN
100100
Out.Open;
101-
TabelleFor;
101+
Tabelle;
102102
END Temperatur.
103103

104104
Temperatur.Tabelle 0 100 10

test/c/overload.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
int add(int x, int y) {
2+
return x + y;
3+
}
4+
5+
float add(float x, float y) {
6+
return x + y;
7+
}
8+
9+
int main() {
10+
int i, j;
11+
return add(i, j);
12+
}

test/oberon/LLVMProgramming1.Mod

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
MODULE Demo;
2+
VAR
3+
i*: INTEGER;
4+
l: LONGINT;
5+
f: REAL;
6+
b: BOOLEAN;
7+
BEGIN
8+
i := 10;
9+
l := i;
10+
f := l / 3;
11+
b := (i - l < 10) & (i + l > 10)
12+
END Demo.

test/oberon/LLVMProgramming2.Mod

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
MODULE LLVMProgramming2;
2+
3+
TYPE
4+
Vector = ARRAY 100 OF INTEGER;
5+
Matrix = ARRAY 10, 10 OF INTEGER;
6+
Point2D = RECORD x, y: INTEGER END;
7+
Triangle = ARRAY 3 OF Point2D;
8+
9+
VAR
10+
i, j: INTEGER;
11+
v: Vector;
12+
m: Matrix;
13+
p: Point2D;
14+
t: Triangle;
15+
16+
PROCEDURE ["C"] PrintF(str: ARRAY OF CHAR; ...); EXTERNAL [ "printf" ];
17+
18+
PROCEDURE WriteInt(val: INTEGER);
19+
BEGIN
20+
PrintF("%d", val)
21+
END WriteInt;
22+
23+
PROCEDURE WriteLn;
24+
BEGIN
25+
PrintF("\n")
26+
END WriteLn;
27+
28+
PROCEDURE Swap(VAR i, j: INTEGER);
29+
VAR t: INTEGER;
30+
BEGIN
31+
t := i;
32+
i := j;
33+
j := t
34+
END Swap;
35+
36+
PROCEDURE Sum(x, y: INTEGER): INTEGER;
37+
BEGIN
38+
RETURN x + y
39+
END Sum;
40+
41+
BEGIN
42+
t[2].x := 3;
43+
t[2].y := t[2].x;
44+
WriteInt(t[2].y);
45+
WriteLn
46+
END LLVMProgramming2.

test/oberon/LLVMProgramming3.Mod

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
MODULE LLVMProgramming3;
2+
3+
CONST Dim = 20;
4+
5+
TYPE Array = ARRAY Dim OF INTEGER;
6+
7+
VAR a: Array;
8+
9+
PROCEDURE Init;
10+
VAR i: INTEGER;
11+
BEGIN
12+
i := 0;
13+
WHILE i < Dim DO
14+
a[i] := Dim-i;
15+
i := i + 1
16+
END
17+
END Init;
18+
19+
PROCEDURE Swap(VAR a, b: INTEGER);
20+
VAR t: INTEGER;
21+
BEGIN
22+
t := a; a := b; b := t
23+
END Swap;
24+
25+
PROCEDURE BubbleSort;
26+
VAR i, j: INTEGER;
27+
BEGIN
28+
i := 0;
29+
WHILE i < Dim DO
30+
j := Dim - 1;
31+
WHILE j > i DO
32+
IF a[j - 1] > a[j] THEN Swap(a[j - 1], a[j]) END;
33+
j := j - 1
34+
END;
35+
i := i + 1
36+
END
37+
END BubbleSort;
38+
39+
PROCEDURE CondExec;
40+
VAR i, j: INTEGER;
41+
BEGIN
42+
IF i > j THEN i := j ELSE j := i END
43+
END CondExec;
44+
45+
PROCEDURE Loop;
46+
VAR i, j: INTEGER;
47+
BEGIN
48+
i := 0; j := 1;
49+
WHILE i < 10 DO
50+
j := j * i;
51+
i := i + 1
52+
END
53+
END Loop;
54+
55+
PROCEDURE Case;
56+
VAR x, y: INTEGER;
57+
ch: CHAR;
58+
BEGIN
59+
x := 0; y := 0;
60+
CASE ch OF
61+
"n": x := -1
62+
| "s": x := 1
63+
| "w": y := -1
64+
| "e": y := 1
65+
END
66+
END Case;
67+
68+
69+
70+
BEGIN
71+
Init;
72+
BubbleSort
73+
END LLVMProgramming3.

0 commit comments

Comments
 (0)