Skip to content

Commit 10b679e

Browse files
committed
Eksami põhiosa harjutus
1 parent 51a52db commit 10b679e

3 files changed

Lines changed: 221 additions & 0 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
grammar Estolog;
2+
@header { package proovieksam; }
3+
4+
// Seda reeglit pole vaja muuta
5+
init : prog EOF;
6+
7+
// Seda reeglit tuleb muuta / täiendada
8+
// (Ilmselt soovid ka defineerida uusi abireegleid)
9+
prog
10+
: 'implementeeri mind!'
11+
;
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package proovieksam;
2+
3+
import org.antlr.v4.runtime.BailErrorStrategy;
4+
import org.antlr.v4.runtime.CharStreams;
5+
import org.antlr.v4.runtime.CommonTokenStream;
6+
import org.antlr.v4.runtime.tree.ParseTree;
7+
import proovieksam.ast.EstologNode;
8+
import utils.ExceptionErrorListener;
9+
10+
import java.io.IOException;
11+
import java.nio.file.Paths;
12+
13+
import static proovieksam.EstologParser.*;
14+
import static proovieksam.ast.EstologNode.*;
15+
16+
public class EstologAst {
17+
18+
static void main() throws IOException {
19+
EstologNode ast = makeEstologAst("""
20+
x := 0;
21+
y := 1;
22+
a := (x JA y);
23+
b := (x VOI y);
24+
25+
(KUI (x = y) SIIS a MUIDU b)""");
26+
System.out.println(ast);
27+
ast.renderPngFile(Paths.get("graphs", "estolog.png"));
28+
}
29+
30+
public static EstologNode makeEstologAst(String input) {
31+
EstologLexer lexer = new EstologLexer(CharStreams.fromString(input));
32+
lexer.removeErrorListeners();
33+
lexer.addErrorListener(new ExceptionErrorListener());
34+
35+
EstologParser parser = new EstologParser(new CommonTokenStream(lexer));
36+
parser.removeErrorListeners();
37+
parser.setErrorHandler(new BailErrorStrategy());
38+
39+
ParseTree tree = parser.init();
40+
//System.out.println(tree.toStringTree(parser));
41+
return parseTreeToAst(tree);
42+
}
43+
44+
// Implementeeri see meetod.
45+
private static EstologNode parseTreeToAst(ParseTree tree) {
46+
throw new UnsupportedOperationException();
47+
}
48+
}
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package proovieksam;
2+
3+
import org.junit.FixMethodOrder;
4+
import org.junit.Test;
5+
import org.junit.runners.MethodSorters;
6+
import proovieksam.ast.EstologNode;
7+
8+
import static org.junit.Assert.assertEquals;
9+
import static org.junit.Assert.fail;
10+
import static proovieksam.ast.EstologNode.*;
11+
12+
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
13+
public class EstologAstTest {
14+
15+
@Test
16+
public void test01_literals_variables() {
17+
legal("0", prog(lit(false))); // 0
18+
legal("1", prog(lit(true))); // 1
19+
legal("x", prog(var("x"))); // x
20+
legal("X", prog(var("X"))); // X
21+
legal("kala", prog(var("kala"))); // kala
22+
legal("abcdefgrstu", prog(var("abcdefgrstu"))); // abcdefgrstu
23+
24+
illegal("2");
25+
illegal("-1");
26+
illegal("00");
27+
illegal("0x");
28+
illegal("0 0");
29+
illegal("x y");
30+
illegal("_");
31+
}
32+
33+
@Test
34+
public void test02_operators() {
35+
legal("0 JA 0", prog(ja(lit(false), lit(false)))); // (0 JA 0)
36+
legal("0 VOI 1", prog(voi(lit(false), lit(true)))); // (0 VOI 1)
37+
legal("x VOI 1", prog(voi(var("x"), lit(true)))); // (x VOI 1)
38+
legal("x JA kalad", prog(ja(var("x"), var("kalad")))); // (x JA kalad)
39+
legal("x NING kalad", prog(ja(var("x"), var("kalad")))); // (x JA kalad)
40+
legal("x = 1", prog(vordus(var("x"), lit(true)))); // (x = 1)
41+
legal("x = z", prog(vordus(var("x"), var("z")))); // (x = z)
42+
legal("(x = z) JA (0 VOI z)", prog(ja(vordus(var("x"), var("z")), voi(lit(false), var("z"))))); // ((x = z) JA (0 VOI z))
43+
legal("(((x = z) JA (0 VOI z)) NING y)", prog(ja(ja(vordus(var("x"), var("z")), voi(lit(false), var("z"))), var("y")))); // (((x = z) JA (0 VOI z)) JA y)
44+
45+
illegal("0 JA 3");
46+
illegal("0 JA 00");
47+
illegal("0 JA");
48+
illegal("JA 0");
49+
illegal("x == y");
50+
illegal("x == y");
51+
illegal("x =(= y)");
52+
illegal("(((x JA 0)");
53+
illegal("(((x JA 0)))))");
54+
illegal("x JA NING y");
55+
illegal("x ja y");
56+
illegal("x ning y");
57+
illegal("x voi y");
58+
}
59+
60+
@Test
61+
public void test03_kui() {
62+
legal("KUI 0 SIIS 1 MUIDU 0", prog(kui(lit(false), lit(true), lit(false)))); // (KUI 0 SIIS 1 MUIDU 0)
63+
legal("KUI x SIIS y MUIDU maja", prog(kui(var("x"), var("y"), var("maja")))); // (KUI x SIIS y MUIDU maja)
64+
legal("KUI (x = 1) SIIS (z VOI y) MUIDU maja", prog(kui(vordus(var("x"), lit(true)), voi(var("z"), var("y")), var("maja")))); // (KUI (x = 1) SIIS (z VOI y) MUIDU maja)
65+
66+
illegal("KUI 0 MUIDU 1");
67+
illegal("SIIS 0 MUIDU 1");
68+
illegal("KUI SIIS 0 MUIDU 1");
69+
illegal("KUI y SIIS MUIDU 1");
70+
illegal("KUI y SIIS a MUIDU");
71+
illegal("KUI y SIIS a MUIDU b MUIDU x");
72+
illegal("KUI y KUI x SIIS a MUIDU b");
73+
illegal("KUI y SIIS JA a MUIDU b");
74+
illegal("KUI y SIIS ((a) MUIDU b");
75+
}
76+
77+
@Test
78+
public void test04_priority() {
79+
legal("a VOI b JA c", prog(voi(var("a"), ja(var("b"), var("c"))))); // (a VOI (b JA c))
80+
legal("a VOI b NING c", prog(ja(voi(var("a"), var("b")), var("c")))); // ((a VOI b) JA c)
81+
legal("a JA b NING c", prog(ja(ja(var("a"), var("b")), var("c")))); // ((a JA b) JA c)
82+
legal("a JA (b NING c)", prog(ja(var("a"), ja(var("b"), var("c"))))); // (a JA (b JA c))
83+
legal("a NING b JA c", prog(ja(var("a"), ja(var("b"), var("c"))))); // (a JA (b JA c))
84+
legal("a JA b JA c NING x VOI e", prog(ja(ja(ja(var("a"), var("b")), var("c")), voi(var("x"), var("e"))))); // (((a JA b) JA c) JA (x VOI e))
85+
legal("a JA b JA c NING x VOI e JA x JA u VOI k NING l VOI a", prog(ja(ja(ja(ja(var("a"), var("b")), var("c")), voi(voi(var("x"), ja(ja(var("e"), var("x")), var("u"))), var("k"))), voi(var("l"), var("a"))))); // ((((a JA b) JA c) JA ((x VOI ((e JA x) JA u)) VOI k)) JA (l VOI a))
86+
legal("a = b JA c = x VOI 1", prog(voi(ja(vordus(var("a"), var("b")), vordus(var("c"), var("x"))), lit(true)))); // (((a = b) JA (c = x)) VOI 1)
87+
legal("KUI 1 SIIS y MUIDU o", prog(kui(lit(true), var("y"), var("o")))); // (KUI 1 SIIS y MUIDU o)
88+
legal("KUI (x = y) = 0 SIIS a NING b VOI x MUIDU g VOI h NING a NING f", prog(kui(vordus(vordus(var("x"), var("y")), lit(false)), ja(var("a"), voi(var("b"), var("x"))), ja(ja(voi(var("g"), var("h")), var("a")), var("f"))))); // (KUI ((x = y) = 0) SIIS (a JA (b VOI x)) MUIDU (((g VOI h) JA a) JA f))
89+
}
90+
91+
@Test
92+
public void test05_defines() {
93+
legal("a := 0; a", prog(var("a"), def("a", lit(false))));
94+
legal("a := 0; b := 0; a", prog(var("a"), def("a", lit(false)), def("b", lit(false))));
95+
legal("a:=0 ;b := 0;a", prog(var("a"), def("a", lit(false)), def("b", lit(false))));
96+
legal("a:=0 ;b := a = a;b", prog(var("b"), def("a", lit(false)), def("b", vordus(var("a"), var("a")))));
97+
98+
illegal("a := 0");
99+
illegal("a = 0; a");
100+
illegal("a : = 0; a");
101+
illegal("a := 0; a; b := 0");
102+
illegal("; a");
103+
illegal("a := 0;");
104+
illegal("a;");
105+
}
106+
107+
@Test
108+
public void test06_examples() {
109+
legal("""
110+
x := 0;
111+
y := 1;
112+
a := (x JA y);
113+
b := (x VOI y);
114+
115+
(KUI (x = y) SIIS a MUIDU b)""",
116+
prog(
117+
kui(vordus(var("x"), var("y")), var("a"), var("b")),
118+
119+
def("x", lit(false)),
120+
def("y", lit(true)),
121+
def("a", ja(var("x"), var("y"))),
122+
def("b", voi(var("x"), var("y")))
123+
));
124+
125+
legal("""
126+
a := kala JA lind; \s
127+
b := 0 = (kass VOI a NING kala);\s
128+
c := KUI a = b SIIS 1 MUIDU b JA c;
129+
KUI a SIIS KUI c SIIS kala MUIDU hiir""",
130+
prog(
131+
kui(var("a"), kui(var("c"), var("kala"), var("hiir"))),
132+
133+
def("a", ja(var("kala"), var("lind"))),
134+
def("b", vordus(lit(false), ja(voi(var("kass"), var("a")), var("kala")))),
135+
def("c", kui(vordus(var("a"), var("b")), lit(true), ja(var("b"), var("c"))))
136+
));
137+
}
138+
139+
@Test
140+
public void test07_kui_without_muidu() {
141+
fail("See test avalikustatakse pärast eksamit! Kas näiteks (KUI (x = 1) SIIS y) ka töötab?");
142+
}
143+
144+
@Test
145+
public void test08_associativity() {
146+
fail("See test avalikustatakse pärast eksamit! Kas näiteks (a = b = c) on keelatud?");
147+
}
148+
149+
private void legal(String input, EstologNode expectedAst) {
150+
EstologNode actualAst = EstologAst.makeEstologAst(input);
151+
assertEquals(expectedAst, actualAst);
152+
}
153+
154+
private void illegal(String input) {
155+
try {
156+
EstologAst.makeEstologAst(input);
157+
fail("expected parse error: " + input);
158+
} catch (Exception _) {
159+
160+
}
161+
}
162+
}

0 commit comments

Comments
 (0)