Skip to content

Commit 51a52db

Browse files
committed
week7 põhiosa lahendused
1 parent 05bb17e commit 51a52db

24 files changed

Lines changed: 1800 additions & 0 deletions

sols/toylangs/bolog/Bolog.g4

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
grammar Bolog;
2+
@header { package toylangs.bolog; }
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+
: NL* expr (NL+ expr)* NL*
11+
;
12+
13+
expr
14+
: TvLit #TvLit
15+
| Var #Var
16+
| '(' expr ')' #Paren
17+
| '!' expr #Unary
18+
| expr op='&&' expr #Binary
19+
| expr op='||' expr #Binary
20+
| expr op='<>' expr #Binary
21+
| con=expr 'kui' (ass+=expr ((',' ass+=expr)* 'ja' ass+=expr)?)? #Imp
22+
;
23+
24+
TvLit : 'JAH' | 'EI';
25+
Var : [A-Z]+;
26+
27+
// Neid soovitame jätta nii:
28+
NL: '\r'? '\n';
29+
WS: [ \t]+ -> skip;

sols/toylangs/bolog/BologAst.java

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package toylangs.bolog;
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 toylangs.bolog.ast.BologNode;
8+
import utils.ExceptionErrorListener;
9+
10+
import java.io.IOException;
11+
import java.nio.file.Paths;
12+
import java.util.HashSet;
13+
import java.util.List;
14+
import java.util.Set;
15+
16+
import static toylangs.bolog.BologParser.*;
17+
import static toylangs.bolog.ast.BologNode.*;
18+
19+
public class BologAst {
20+
21+
22+
public static Set<BologNode> makeBologAst(String sisend) {
23+
BologLexer lexer = new BologLexer(CharStreams.fromString(sisend));
24+
lexer.removeErrorListeners();
25+
lexer.addErrorListener(new ExceptionErrorListener());
26+
27+
BologParser parser = new BologParser(new CommonTokenStream(lexer));
28+
parser.removeErrorListeners();
29+
parser.setErrorHandler(new BailErrorStrategy());
30+
31+
ParseTree tree = parser.init();
32+
//System.out.println(tree.toStringTree(parser));
33+
return parseTreetoAst(tree);
34+
}
35+
36+
// Implementeerida parsepuu -> AST teisendus!
37+
private static Set<BologNode> parseTreetoAst(ParseTree tree) {
38+
Set<BologNode> nodes = new HashSet<>();
39+
new BologBaseVisitor<BologNode>() {
40+
41+
@Override
42+
public BologNode visitProg(ProgContext ctx) {
43+
for (ExprContext exprContext : ctx.expr()) {
44+
nodes.add(visit(exprContext));
45+
}
46+
return null;
47+
}
48+
49+
@Override
50+
public BologNode visitTvLit(TvLitContext ctx) {
51+
return tv(ctx.getText().equals("JAH"));
52+
}
53+
54+
@Override
55+
public BologNode visitVar(VarContext ctx) {
56+
return var(ctx.getText());
57+
}
58+
59+
@Override
60+
public BologNode visitBinary(BinaryContext ctx) {
61+
BologNode left = visit(ctx.expr(0));
62+
BologNode right = visit(ctx.expr(1));
63+
return switch (ctx.op.getText()) {
64+
case "&&" -> and(left, right);
65+
case "||" -> or(left, right);
66+
case "<>" -> xor(left, right);
67+
default -> throw new IllegalArgumentException();
68+
};
69+
}
70+
71+
@Override
72+
public BologNode visitImp(ImpContext ctx) {
73+
List<BologNode> assumptions = ctx.ass.stream().map(this::visit).toList();
74+
return imp(visit(ctx.con), assumptions);
75+
}
76+
77+
@Override
78+
public BologNode visitUnary(UnaryContext ctx) {
79+
return not(visit(ctx.expr()));
80+
}
81+
82+
@Override
83+
public BologNode visitParen(ParenContext ctx) {
84+
return visit(ctx.expr());
85+
}
86+
}.visit(tree);
87+
88+
return nodes;
89+
}
90+
91+
92+
static void main() throws IOException {
93+
String input = "X kui Y\nZ && Y";
94+
Set<BologNode> bologNodes = makeBologAst(input);
95+
int idx = 1;
96+
for (BologNode bologNode : bologNodes) {
97+
bologNode.renderPngFile(Paths.get("graphs", "bolog" + idx++ + ".png"));
98+
System.out.println(bologNode);
99+
}
100+
}
101+
102+
103+
104+
}

sols/toylangs/dialoog/Dialoog.g4

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
grammar Dialoog;
2+
@header { package toylangs.dialoog; }
3+
4+
// Ära seda reeglit muuda, selle kaudu testitakse grammatikat
5+
init : prog EOF;
6+
7+
// Seda reeglit tuleb muuta / täiendada
8+
// (Ilmselt soovid ka defineerida uusi abireegleid)
9+
prog
10+
: decl* 'Arvuta:' expr
11+
;
12+
13+
14+
decl : Var 'on' typ=(BType|IntType) '!' ;
15+
16+
expr
17+
: TvLit #TvLit
18+
| IntLit #IntLit
19+
| Var #Var
20+
| 'Oota' expr 'Valmis' #Paren
21+
| op=('!'|'-') expr #Unary
22+
| expr op=('*'|'/') expr #Binary
23+
| expr op=('+'|'-') expr #Binary
24+
| expr op='on' expr #Binary
25+
| expr op='&' expr #Binary
26+
| expr op='|' expr #Binary
27+
| 'Kas' expr '?'
28+
'Jah:' expr
29+
'Ei:' expr
30+
'Selge' #Ifte
31+
;
32+
33+
IntLit : '0'|[1-9][0-9]*;
34+
TvLit : 'jah' | 'ei';
35+
36+
BType : 'bool' [a-z]*;
37+
IntType : 'int' [a-z]*;
38+
Var : [a-z]+;
39+
40+
// Siin soovitame tühjust ignoreerida:
41+
WS : [ \r\n\t] -> skip;
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package toylangs.dialoog;
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 toylangs.dialoog.ast.DialoogDecl;
8+
import toylangs.dialoog.ast.DialoogNode;
9+
import utils.ExceptionErrorListener;
10+
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
14+
import static toylangs.dialoog.ast.DialoogNode.*;
15+
16+
public class DialoogAst {
17+
18+
public static DialoogNode makeDialoogAst(String sisend) {
19+
DialoogLexer lexer = new DialoogLexer(CharStreams.fromString(sisend));
20+
lexer.removeErrorListeners();
21+
lexer.addErrorListener(new ExceptionErrorListener());
22+
23+
DialoogParser parser = new DialoogParser(new CommonTokenStream(lexer));
24+
parser.removeErrorListeners();
25+
parser.setErrorHandler(new BailErrorStrategy());
26+
27+
ParseTree tree = parser.init();
28+
//System.out.println(tree.toStringTree(parser));
29+
return parseTreetoAst(tree);
30+
}
31+
32+
// Implementeerida parsepuu -> AST teisendus!
33+
private static DialoogNode parseTreetoAst(ParseTree tree) {
34+
return new DialoogBaseVisitor<DialoogNode>() {
35+
36+
@Override
37+
public DialoogNode visitInit(DialoogParser.InitContext ctx) {
38+
return visit(ctx.prog());
39+
}
40+
41+
@Override
42+
public DialoogNode visitTvLit(DialoogParser.TvLitContext ctx) {
43+
return bl(ctx.getText().equals("jah"));
44+
}
45+
46+
@Override
47+
public DialoogNode visitIntLit(DialoogParser.IntLitContext ctx) {
48+
return il(Integer.parseInt(ctx.getText()));
49+
}
50+
51+
@Override
52+
public DialoogNode visitVar(DialoogParser.VarContext ctx) {
53+
return var(ctx.getText());
54+
}
55+
56+
@Override
57+
public DialoogNode visitUnary(DialoogParser.UnaryContext ctx) {
58+
return unop(ctx.op.getText(), visit(ctx.expr()));
59+
}
60+
61+
@Override
62+
public DialoogNode visitBinary(DialoogParser.BinaryContext ctx) {
63+
return binop(ctx.op.getText(), visit(ctx.expr(0)), visit(ctx.expr(1)));
64+
}
65+
66+
@Override
67+
public DialoogNode visitIfte(DialoogParser.IfteContext ctx) {
68+
return ifte(visit(ctx.expr(0)), visit(ctx.expr(1)), visit(ctx.expr(2)));
69+
}
70+
71+
@Override
72+
public DialoogNode visitParen(DialoogParser.ParenContext ctx) {
73+
return visit(ctx.expr());
74+
}
75+
76+
@Override
77+
public DialoogNode visitProg(DialoogParser.ProgContext ctx) {
78+
List<DialoogDecl> decls = new ArrayList<>();
79+
for (DialoogParser.DeclContext declContext : ctx.decl()) {
80+
boolean isInt = declContext.typ.getText().startsWith("int");
81+
String varname = declContext.Var().getText();
82+
decls.add(new DialoogDecl(varname, isInt));
83+
}
84+
return DialoogNode.prog(decls, visit(ctx.expr()));
85+
}
86+
}.visit(tree);
87+
}
88+
89+
static void main() {
90+
String sisend =
91+
"""
92+
x on bool! y on int!
93+
Arvuta:\s
94+
2 *\s
95+
Kas 5 + 5 on 10?\s
96+
Jah: Kas 5 + 5 on 10?\s
97+
Jah: 35 * Oota Oota 2 + 2 Valmis - 3 Valmis
98+
Ei: 100\s
99+
Selge\s
100+
Ei: 100\s
101+
Selge\s
102+
+ 30 + Kas jah?
103+
Jah: 10
104+
Ei: 300
105+
Selge""";
106+
107+
System.out.println(makeDialoogAst(sisend));
108+
}
109+
110+
}
111+
112+

sols/toylangs/hulk/Hulk.g4

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
grammar Hulk;
2+
@header { package toylangs.hulk; }
3+
4+
// Seda reeglit pole vaja muuta
5+
init : program EOF;
6+
7+
// Seda reeglit tuleb muuta / täiendada
8+
// (Ilmselt soovid ka defineerida uusi abireegleid)
9+
program
10+
: stmt (NL stmt)*
11+
;
12+
13+
stmt
14+
: Set op=':=' expr ('|' cond)?
15+
| Set op=('<-' | '->') elements ('|' cond)?
16+
;
17+
18+
cond
19+
: expr 'subset' expr #Subset
20+
| Element 'in' expr #Incl
21+
;
22+
23+
expr
24+
: expr op=('+' | '&' | '-') expr #BinOp
25+
| Set #Var
26+
| '{' elements? '}' #Lit
27+
| '(' expr ')' #Paren
28+
;
29+
30+
elements
31+
: Element (',' Element)*
32+
;
33+
34+
Set : [A-Z];
35+
Element : [a-z];
36+
37+
NL : ('\r')?'\n';
38+
WS : [ \t] -> skip;

0 commit comments

Comments
 (0)