Skip to content

Commit c55f6e1

Browse files
committed
Eksami põhiosa harjutuse lahendus
1 parent dcadb62 commit c55f6e1

2 files changed

Lines changed: 147 additions & 0 deletions

File tree

sols/proovieksam/Estolog.g4

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
: (def ';')* avaldis
11+
;
12+
13+
def
14+
: Muutuja ':=' avaldis
15+
;
16+
17+
avaldis
18+
: avaldis 'JA' avaldis # BinOp
19+
| avaldis 'VOI' avaldis # BinOp
20+
| avaldis 'NING' avaldis # BinOp
21+
| 'KUI' avaldis 'SIIS' avaldis ('MUIDU' avaldis)? # KuiSiis
22+
| lihtneAvaldis '=' lihtneAvaldis # BinOp
23+
| lihtneAvaldis # Lihtne
24+
;
25+
26+
lihtneAvaldis
27+
: Muutuja # Muutuja
28+
| Arv # Literaal
29+
| '(' avaldis ')' # Sulud
30+
;
31+
32+
Muutuja : [a-zA-Z]+;
33+
Arv : [01];
34+
35+
WS : [ \r\n\t] -> skip;

sols/proovieksam/EstologAst.java

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
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.EstologDef;
8+
import proovieksam.ast.EstologNode;
9+
import utils.ExceptionErrorListener;
10+
11+
import java.io.IOException;
12+
import java.nio.file.Paths;
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
16+
import static proovieksam.EstologParser.*;
17+
import static proovieksam.ast.EstologNode.*;
18+
19+
public class EstologAst {
20+
21+
static void main() throws IOException {
22+
EstologNode ast = makeEstologAst("""
23+
x := 0;
24+
y := 1;
25+
a := (x JA y);
26+
b := (x VOI y);
27+
28+
(KUI (x = y) SIIS a MUIDU b)""");
29+
System.out.println(ast);
30+
ast.renderPngFile(Paths.get("graphs", "estolog.png"));
31+
}
32+
33+
public static EstologNode makeEstologAst(String input) {
34+
EstologLexer lexer = new EstologLexer(CharStreams.fromString(input));
35+
lexer.removeErrorListeners();
36+
lexer.addErrorListener(new ExceptionErrorListener());
37+
38+
EstologParser parser = new EstologParser(new CommonTokenStream(lexer));
39+
parser.removeErrorListeners();
40+
parser.setErrorHandler(new BailErrorStrategy());
41+
42+
ParseTree tree = parser.init();
43+
//System.out.println(tree.toStringTree(parser));
44+
return parseTreeToAst(tree);
45+
}
46+
47+
// Implementeeri see meetod.
48+
private static EstologNode parseTreeToAst(ParseTree tree) {
49+
EstologBaseVisitor<EstologNode> visitor = new EstologBaseVisitor<>() {
50+
@Override
51+
public EstologNode visitInit(InitContext ctx) {
52+
return visit(ctx.prog());
53+
}
54+
55+
@Override
56+
public EstologNode visitProg(ProgContext ctx) {
57+
List<EstologDef> defs = new ArrayList<>();
58+
for (DefContext defContext : ctx.def()) {
59+
defs.add(visitDef(defContext)); // otse õige visit kutse
60+
}
61+
EstologNode avaldis = visit(ctx.avaldis());
62+
return prog(avaldis, defs);
63+
}
64+
65+
@Override
66+
public EstologDef visitDef(DefContext ctx) {
67+
// täpsustatud tagastustüüp
68+
return def(ctx.Muutuja().getText(), visit(ctx.avaldis()));
69+
}
70+
71+
@Override
72+
public EstologNode visitLiteraal(LiteraalContext ctx) {
73+
return lit(ctx.getText().equals("1"));
74+
}
75+
76+
@Override
77+
public EstologNode visitMuutuja(MuutujaContext ctx) {
78+
return var(ctx.getText());
79+
}
80+
81+
@Override
82+
public EstologNode visitSulud(SuludContext ctx) {
83+
return visit(ctx.avaldis());
84+
}
85+
86+
@Override
87+
public EstologNode visitBinOp(BinOpContext ctx) {
88+
EstologNode left = visit(ctx.getChild(0));
89+
EstologNode right = visit(ctx.getChild(2));
90+
return switch (ctx.getChild(1).getText()) {
91+
case "=" -> vordus(left, right);
92+
case "VOI" -> voi(left, right);
93+
case "JA", "NING" -> ja(left, right);
94+
default -> throw new UnsupportedOperationException();
95+
};
96+
}
97+
98+
@Override
99+
public EstologNode visitKuiSiis(KuiSiisContext ctx) {
100+
EstologNode kui = visit(ctx.avaldis(0));
101+
EstologNode siis = visit(ctx.avaldis(1));
102+
EstologNode muidu = null;
103+
if (ctx.avaldis(2) != null) muidu = visit(ctx.avaldis(2));
104+
return kui(kui, siis, muidu);
105+
}
106+
107+
// Lihtne käsitletakse BaseVisitor-is vaikimisi
108+
};
109+
110+
return visitor.visit(tree);
111+
}
112+
}

0 commit comments

Comments
 (0)