Skip to content

Commit 22cab4b

Browse files
committed
week6 materjalid
1 parent 05b2188 commit 22cab4b

49 files changed

Lines changed: 2722 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package week6;
2+
3+
import static week5.AktkToken.Type.*;
4+
5+
public class AktkHandwrittenParser {
6+
7+
public static AktkNode parse(String input) {
8+
throw new UnsupportedOperationException();
9+
}
10+
11+
}

src/main/java/week6/AktkNode.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package week6;
2+
3+
import java.util.Map;
4+
5+
import static week5.AktkToken.Type.*;
6+
7+
public interface AktkNode {
8+
9+
static AktkNode num(int value) {
10+
throw new UnsupportedOperationException();
11+
}
12+
13+
static AktkNode var(String name) {
14+
throw new UnsupportedOperationException();
15+
}
16+
17+
static AktkNode plus(AktkNode left, AktkNode right) {
18+
throw new UnsupportedOperationException();
19+
}
20+
21+
static AktkNode minus(AktkNode left, AktkNode right) {
22+
throw new UnsupportedOperationException();
23+
}
24+
25+
static AktkNode mul(AktkNode left, AktkNode right) {
26+
throw new UnsupportedOperationException();
27+
}
28+
29+
static AktkNode div(AktkNode left, AktkNode right) {
30+
throw new UnsupportedOperationException();
31+
}
32+
33+
int eval(Map<String, Integer> env);
34+
35+
default String toPrettyString() {
36+
return toString();
37+
}
38+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package week6;
2+
3+
import week5.AktkToken;
4+
5+
import java.util.Arrays;
6+
import java.util.LinkedHashSet;
7+
import java.util.Set;
8+
9+
/*
10+
* Seda klassi ei ole vaja muuta ega esitada
11+
*/
12+
public class AktkParseException extends RuntimeException {
13+
private final AktkToken token;
14+
private final Set<AktkToken.Type> expected;
15+
16+
public AktkToken getToken() {
17+
return token;
18+
}
19+
20+
public Set<AktkToken.Type> getExpected() {
21+
return expected;
22+
}
23+
24+
public AktkParseException(AktkToken tok, AktkToken.Type... expected) {
25+
super("Unexpected token '" + tok + "' but expected: " + Arrays.toString(expected));
26+
this.token = tok;
27+
this.expected = new LinkedHashSet<>(Arrays.asList(expected));
28+
}
29+
30+
// Kui ei soovi täpsema veatöötlusega tegeleda.
31+
public AktkParseException() {
32+
token = null;
33+
expected = null;
34+
}
35+
36+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package week6.kalaparser;
2+
3+
/**
4+
* Kirjutame ise parseri, et saaks parseri abifunktsioonidest aru!
5+
* Testide läbimiseks ei pea ASTi tagastama, seega on parse meetodi tüüp esialgu void.
6+
*/
7+
public class IntroParser {
8+
9+
public static void parse(String input) {
10+
throw new UnsupportedOperationException();
11+
}
12+
13+
static void main() {
14+
String input = "aaabbb";
15+
System.out.println("Parsing: " + input);
16+
try {
17+
IntroParser.parse(input);
18+
System.out.print("ACCEPT!");
19+
} catch (RuntimeException e) {
20+
System.out.println("REJECT!");
21+
}
22+
}
23+
24+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package week6.kalaparser;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.StringJoiner;
7+
8+
import static week6.kalaparser.KalaNode.*;
9+
10+
public sealed interface KalaNode permits KalaIdent, KalaList, KalaNull {
11+
12+
int sum(Map<String, Integer> env);
13+
14+
static KalaNode mkNull() {
15+
return new KalaNull();
16+
}
17+
18+
static KalaNode mkIdent(String name) {
19+
return new KalaIdent(name);
20+
}
21+
22+
static KalaNode mkList(List<KalaNode> args) {
23+
return new KalaList(args);
24+
}
25+
26+
static KalaNode mkList(KalaNode... args) {
27+
return mkList(Arrays.asList(args));
28+
}
29+
30+
31+
// Siit edasi on siis lahendus ette antud, et selle peale mitte jälle liiga palju aega kulutada.
32+
// Nende peidetud "sisemiste" klasside asemel võid kodutöös teha täiesti eraldi avalikud klassid!
33+
34+
record KalaIdent(String name) implements KalaNode {
35+
36+
@Override
37+
public String toString() {
38+
return name;
39+
}
40+
41+
@Override
42+
public int sum(Map<String, Integer> env) {
43+
throw new UnsupportedOperationException();
44+
}
45+
}
46+
47+
record KalaList(List<KalaNode> args) implements KalaNode {
48+
49+
@Override
50+
public String toString() {
51+
StringJoiner joiner = new StringJoiner(", ", "(", ")");
52+
for (KalaNode arg : args) joiner.add(arg.toString());
53+
return joiner.toString();
54+
}
55+
56+
@Override
57+
public int sum(Map<String, Integer> env) {
58+
return args.stream().mapToInt(n -> n.sum(env)).sum();
59+
}
60+
}
61+
62+
record KalaNull() implements KalaNode {
63+
64+
@Override
65+
public String toString() {
66+
return "NULL";
67+
}
68+
69+
@Override
70+
public int sum(Map<String, Integer> env) {
71+
return 0;
72+
}
73+
}
74+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package week6.kalaparser;
2+
3+
import week5.kalalexer.KalaToken;
4+
5+
import java.util.Arrays;
6+
import java.util.LinkedHashSet;
7+
import java.util.Set;
8+
9+
public class KalaParseException extends RuntimeException {
10+
private final KalaToken token;
11+
private final Set<KalaToken.Type> expected;
12+
13+
public KalaToken getToken() {
14+
return token;
15+
}
16+
17+
public Set<KalaToken.Type> getExpected() {
18+
return expected;
19+
}
20+
21+
public KalaParseException(KalaToken tok, KalaToken.Type... expected) {
22+
super("Unexpected token '" + tok + "', but expected: " + Arrays.toString(expected));
23+
this.token = tok;
24+
this.expected = new LinkedHashSet<>(Arrays.asList(expected));
25+
}
26+
27+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package week6.kalaparser;
2+
3+
import week5.kalalexer.KalaLexer;
4+
import week5.kalalexer.KalaToken;
5+
6+
import java.util.List;
7+
8+
import static week5.kalalexer.KalaToken.Type.*;
9+
10+
public class KalaParser {
11+
12+
private final List<KalaToken> tokens;
13+
private int pos;
14+
15+
private KalaParser(KalaLexer lexer) {
16+
this.tokens = lexer.readAllTokens();
17+
this.pos = 0;
18+
}
19+
20+
public static KalaNode parse(String input) {
21+
KalaLexer lexer = new KalaLexer(input);
22+
// Ja kuidagi võiks nüüd seda lekserit kasutada oma parseris...
23+
KalaParser parser = new KalaParser(lexer);
24+
return parser.parse();
25+
}
26+
27+
private KalaNode parse() {
28+
KalaNode node = s();
29+
done();
30+
return node;
31+
}
32+
33+
private void done() {
34+
if (peek().type() != EOF) throw new KalaParseException(peek(), EOF);
35+
}
36+
37+
private KalaToken peek() {
38+
return tokens.get(pos);
39+
}
40+
41+
private void match(KalaToken.Type tokenType) {
42+
if (peek().type() != tokenType) {
43+
throw new KalaParseException(peek(), tokenType);
44+
}
45+
pos++;
46+
}
47+
48+
49+
// S → (L) | ()
50+
// L → A,L | A
51+
// A → w | 0 | S
52+
private KalaNode s() {
53+
return null;
54+
}
55+
56+
static void main() {
57+
KalaNode ast = parse("(kala, (x,y , null, (), (kala,()) ))");
58+
System.out.println(ast);
59+
}
60+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package week6.lausearvutus;
2+
3+
import java.util.Map;
4+
5+
/**
6+
* Klassi Formula ei ole vaja muuta
7+
* (aga tõenäoliselt tahad luua sellele konkreetseid alamklasse).
8+
*
9+
* Soovi korral võid siia ka meetodeid juurde lisada.
10+
*/
11+
public interface Formula {
12+
/**
13+
* Konkreetsete valemi puhul peab toString andma valemi tavapärasel
14+
* infikssel kujul, aga nii, et kõigi binaarsete tehete ümber on sulud
15+
* ja eituste ning lausemuutujate ümber (vahetult) sulge ei ole.
16+
* Näiteks valemile A∨B&(¬(¬C)) vastava Formula korral peaks toString-i
17+
* tulemus olema "(A∨(B&¬¬C))"; valemi A&B&C&D puhul peab tulemus olema
18+
* "(((A&B)&C)&D)".
19+
* <p>
20+
* Tulemus ei tohi sisaldada tühikuid.
21+
*/
22+
@Override
23+
String toString();
24+
25+
26+
/**
27+
* Konkreetsetes alamklassides peab equals tagastama true parajasti siis,
28+
* kui argumendiks on Formula, millel on täpselt sama struktuur
29+
* (sh. muutujanimed), nagu sellel valemil.
30+
*/
31+
@Override
32+
boolean equals(Object obj);
33+
34+
/**
35+
* Konkreetsetes alamkassides peab evaluate tagastama valemi väärtuse
36+
* näidatud väärtustusel.
37+
* <p>
38+
* Kui mõne muutuja väärtus puudub, siis tuleb visata erind
39+
* (seda ka siis, kui valemi väärtus selle muutuja väärtusest ei sõltu).
40+
*/
41+
boolean evaluate(Map<Character, Boolean> variableValues);
42+
43+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package week6.lausearvutus;
2+
3+
public class FormulaUtils {
4+
5+
static void main() {
6+
String valem = "x&y∨r";
7+
System.out.println(parseFormula(valem));
8+
}
9+
10+
/**
11+
* parseFormula peab tagastama sõnena antud lausearvutuse valemile
12+
* vastava andmestruktuuri.
13+
* <p>
14+
* Süntaktiliselt mittekorrektsete valemite korral tuleb visata erind.
15+
*/
16+
public static Formula parseFormula(String formula) {
17+
throw new UnsupportedOperationException();
18+
}
19+
20+
/**
21+
* moveNegations peab tagastama uue valemi, kus kõik eitused on
22+
* viidud vahetult lausemuutujate ette järgmiste reeglite põhjal:
23+
* <p>
24+
* ¬(¬F) === F
25+
* ¬(F&G) === ¬F∨¬G
26+
* ¬(F∨G) === ¬F&¬G
27+
* ¬(F→G) === F&¬G
28+
* ¬(F↔G) === F↔¬G
29+
* <p>
30+
* NB! Antud reeglites tähistavad F ja G suvalisi valemeid, mitte tingimata
31+
* ainult lausemuutujaid.
32+
* <p>
33+
* NB! Kuigi eitusi saaks sisse viia ka teisiti, tuleks praegu kasutada
34+
* just neid teisendusi.
35+
*/
36+
public static Formula moveNegations(Formula valem) {
37+
throw new UnsupportedOperationException();
38+
}
39+
}

0 commit comments

Comments
 (0)