Skip to content

Commit ecd4330

Browse files
committed
week9 lõviosa materjalid
1 parent 28e0636 commit ecd4330

27 files changed

Lines changed: 1583 additions & 0 deletions

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,5 @@ gen
1717

1818
# week3
1919
graphs
20+
# week9
21+
cmas
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package toylangs.bolog;
2+
3+
import cma.CMaProgram;
4+
import cma.CMaProgramWriter;
5+
import toylangs.bolog.ast.*;
6+
7+
import java.util.Arrays;
8+
import java.util.List;
9+
10+
public class BologCompiler {
11+
12+
private static final List<String> VARS = Arrays.asList("P", "Q", "R", "S", "T", "U", "V"); // kasuta VARS.indexOf
13+
14+
private final CMaProgramWriter pw = new CMaProgramWriter();
15+
16+
public static CMaProgram compile(BologNode node) {
17+
BologCompiler bologCompiler = new BologCompiler();
18+
bologCompiler.compileNode(node);
19+
return bologCompiler.pw.toProgram();
20+
}
21+
22+
private void compileNode(BologNode node) {
23+
throw new UnsupportedOperationException();
24+
}
25+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package toylangs.dialoog;
2+
3+
import cma.CMaProgram;
4+
import cma.CMaProgramWriter;
5+
import toylangs.dialoog.ast.*;
6+
7+
public class DialoogCompiler {
8+
private final CMaProgramWriter pw = new CMaProgramWriter();
9+
10+
public static CMaProgram compile(DialoogProg prog) {
11+
DialoogCompiler dialoogCompiler = new DialoogCompiler();
12+
dialoogCompiler.compileNode(prog);
13+
return dialoogCompiler.pw.toProgram();
14+
}
15+
16+
private void compileNode(DialoogNode node) {
17+
throw new UnsupportedOperationException();
18+
}
19+
}

src/main/java/toylangs/dialoog/ast/DialoogBinary.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package toylangs.dialoog.ast;
22

3+
import cma.instruction.CMaBasicInstruction;
4+
35
import java.util.Arrays;
46
import java.util.List;
57
import java.util.Map;
@@ -37,6 +39,10 @@ public BinaryOperator<Object> toJava() {
3739
return javaOp;
3840
}
3941

42+
public CMaBasicInstruction.Code toCMa() {
43+
return CMaBasicInstruction.Code.valueOf(toString().substring(7).toUpperCase());
44+
}
45+
4046
private final static Map<String, BinOp> symbolMap =
4147
Arrays.stream(BinOp.values()).collect(toMap(BinOp::getSymb, identity()));
4248

src/main/java/toylangs/dialoog/ast/DialoogUnary.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package toylangs.dialoog.ast;
22

3+
import cma.instruction.CMaBasicInstruction;
4+
35
import java.util.Arrays;
46
import java.util.Map;
57
import java.util.function.UnaryOperator;
@@ -28,6 +30,10 @@ public UnaryOperator<Object> toJava() {
2830
return javaOp;
2931
}
3032

33+
public CMaBasicInstruction.Code toCMa() {
34+
return CMaBasicInstruction.Code.valueOf(toString().substring(7).toUpperCase());
35+
}
36+
3137
private final static Map<String, UnOp> symbolMap =
3238
Arrays.stream(UnOp.values()).collect(toMap(UnOp::getSymb, identity()));
3339

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package toylangs.hulk;
2+
3+
import cma.CMaProgram;
4+
import cma.CMaProgramWriter;
5+
import toylangs.hulk.ast.*;
6+
7+
import java.util.*;
8+
9+
import static cma.CMaUtils.bool2int;
10+
11+
public class HulkCompiler {
12+
private static final List<Character> SET_VARIABLES = Arrays.asList('X', 'A', 'B', 'C', 'D', 'G', 'H', 'V'); // kasuta SET_VARIABLES.indexOf
13+
14+
// kasuta hulga literaali teisendamiseks arvuks (bitset)
15+
private static int set2int(Set<Character> set) {
16+
List<Character> ELEM_VARIABLES = Arrays.asList('x', 'y', 'z', 'a', 'b', 'c', 'u', 'v');
17+
int result = 0;
18+
if (set != null) {
19+
for (int i = 0; i < ELEM_VARIABLES.size(); i++) {
20+
result |= bool2int(set.contains(ELEM_VARIABLES.get(i))) << i;
21+
}
22+
}
23+
return result;
24+
}
25+
26+
private final CMaProgramWriter pw = new CMaProgramWriter();
27+
28+
public static CMaProgram compile(HulkProg prog) {
29+
HulkCompiler hulkCompiler = new HulkCompiler();
30+
hulkCompiler.compileNode(prog);
31+
return hulkCompiler.pw.toProgram();
32+
}
33+
34+
private void compileNode(HulkNode node) {
35+
throw new UnsupportedOperationException();
36+
}
37+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package toylangs.imp;
2+
3+
import cma.CMaInterpreter;
4+
import cma.CMaProgram;
5+
import cma.CMaProgramWriter;
6+
import cma.CMaStack;
7+
import toylangs.imp.ast.*;
8+
9+
import java.io.IOException;
10+
import java.nio.file.Paths;
11+
import java.util.*;
12+
13+
import static toylangs.imp.ast.ImpNode.*;
14+
15+
public class ImpCompiler {
16+
private final CMaProgramWriter pw = new CMaProgramWriter();
17+
18+
public static CMaProgram compile(ImpProg prog) {
19+
ImpCompiler impCompiler = new ImpCompiler();
20+
impCompiler.compileNode(prog);
21+
return impCompiler.pw.toProgram();
22+
}
23+
24+
private void compileNode(ImpNode node) {
25+
throw new UnsupportedOperationException();
26+
}
27+
28+
static void main() throws IOException {
29+
ImpProg prog = prog(
30+
var('x'),
31+
32+
assign('x', num(5)),
33+
assign('y', add(var('x'), num(1))),
34+
assign('x', add(var('y'), num(1)))
35+
);
36+
37+
// väärtustame otse
38+
System.out.printf("eval: %d%n", ImpEvaluator.eval(prog));
39+
40+
// kompileeri avaldist arvutav CMa programm
41+
CMaProgram program = compile(prog);
42+
43+
// kirjuta programm faili, mida saab Vam-iga vaadata
44+
CMaStack initialStack = new CMaStack();
45+
program.toFile(Paths.get("cmas", "imp.cma"), initialStack);
46+
47+
// interpreteeri CMa programm
48+
CMaStack finalStack = CMaInterpreter.run(program, initialStack);
49+
System.out.printf("compiled: %d%n", finalStack.peek());
50+
System.out.printf("finalStack: %s%n", finalStack);
51+
}
52+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package toylangs.modul;
2+
3+
import cma.CMaProgram;
4+
import cma.CMaProgramWriter;
5+
import toylangs.modul.ast.*;
6+
7+
import java.util.List;
8+
9+
public class ModulCompiler {
10+
public final CMaProgramWriter pw = new CMaProgramWriter();
11+
private final int m;
12+
private final List<String> variables;
13+
14+
protected ModulCompiler(int m, List<String> variables) {
15+
this.m = m;
16+
this.variables = variables;
17+
}
18+
19+
public static CMaProgram compile(ModulProg prog, List<String> variables) {
20+
ModulCompiler modulCompiler = new ModulCompiler(prog.modulus(), variables);
21+
modulCompiler.compile(prog.expr());
22+
return modulCompiler.pw.toProgram();
23+
}
24+
25+
protected void compile(ModulExpr expr) {
26+
throw new UnsupportedOperationException();
27+
}
28+
}

src/main/java/toylangs/modul/README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,15 @@ Süntaksile kehtivad järgmised nõuded:
4747
5. Programm koosneb avaldisest ning sulgudes võtmesõnast `mod`, tühikust ja naturaalarvust.
4848
6. Avaldistes võib kasutada sulge, mis on kõige kõrgema prioriteediga.
4949
7. Tühisümboleid (tühikud, tabulaatorid, reavahetused) tuleb ignoreerida, välja arvatud ülal nõutud.
50+
51+
## Lõviosa: ModulCompiler
52+
53+
Klassis *ModulCompiler* tuleb implementeerida meetod *compile*, mis kompileerib programmi CMa programmiks.
54+
Kompileerimisele kehtivad järgmised nõuded:
55+
56+
1. Muutujate väärtused antakse *stack*'il etteantud järjekorras.
57+
2. Programmi täitmise lõpuks peab *stack*'i pealmine element olema avaldise väärtus, mis on sama nagu *ModulEvaluator*-iga väärtustades.
58+
3. Programmi täitmise lõpuks tohivad *stack*'il olla ainult etteantud muutujate algsed väärtused ja arvutatud avaldise väärtus.
59+
4. Defineerimata muutuja kasutamisel visatakse *ModulException* **kompileerimise ajal**.
60+
61+
> **PS.** Kuna astendajad on konstantsed, siis astendamise saab kompileerida `DUP` ja `MUL` instruktsioonide jadaks.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package toylangs.parm;
2+
3+
import cma.CMaProgram;
4+
import cma.CMaProgramWriter;
5+
import toylangs.parm.ast.*;
6+
7+
import java.util.Arrays;
8+
import java.util.List;
9+
10+
import static toylangs.parm.ast.ParmNode.*;
11+
12+
public class ParmCompiler {
13+
14+
public static final List<String> VARS = Arrays.asList("X", "Y", "Z", "A", "B", "C", "D"); // kasuta VARS.indexOf
15+
16+
private final CMaProgramWriter pw = new CMaProgramWriter();
17+
18+
public static CMaProgram compile(ParmNode node) {
19+
ParmCompiler parmCompiler = new ParmCompiler();
20+
parmCompiler.compileNode(node);
21+
return parmCompiler.pw.toProgram();
22+
}
23+
24+
private void compileNode(ParmNode node) {
25+
throw new UnsupportedOperationException();
26+
}
27+
28+
static void main() {
29+
CMaProgram cMaProgram = compile(plus(lit(10), lit(12)));
30+
System.out.println(cMaProgram.toString());
31+
}
32+
}

0 commit comments

Comments
 (0)