Skip to content

Commit a86eb88

Browse files
committed
week6 ennustavate parserite lahendused
1 parent 22cab4b commit a86eb88

3 files changed

Lines changed: 270 additions & 0 deletions

File tree

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package week6.parsers.mini;
2+
3+
import week6.parsers.Node;
4+
import week6.parsers.Parser;
5+
6+
// S → ABAR
7+
// A → a | aAb
8+
// B → bb | BbSb
9+
// R → +S | ε
10+
public class AbbaParser extends Parser {
11+
12+
public AbbaParser(String input) {
13+
super(input);
14+
}
15+
16+
// S → ABAR
17+
@Override
18+
protected Node s() {
19+
Node n = new Node('S');
20+
n.add(a());
21+
n.add(b());
22+
n.add(a());
23+
n.add(r());
24+
return n;
25+
}
26+
27+
// A → a(Ab|ε)
28+
private Node a() {
29+
Node n = new Node('A');
30+
n.add(match('a'));
31+
switch (peek()) {
32+
case 'a':
33+
n.add(a());
34+
n.add(match('b'));
35+
break;
36+
case 'b':
37+
case '$':
38+
case '+':
39+
break;
40+
default:
41+
expected('a', 'b', '$', '+');
42+
}
43+
return n;
44+
}
45+
46+
// B → bbQ
47+
private Node b() {
48+
Node n = new Node('B');
49+
n.add(match('b'));
50+
n.add(match('b'));
51+
return q(n);
52+
}
53+
54+
// Q → bSbQ | ε
55+
private Node q(Node b) {
56+
switch (peek()) {
57+
case 'b':
58+
Node n = new Node('B');
59+
n.add(b);
60+
n.add(match('b'));
61+
n.add(s());
62+
n.add(match('b'));
63+
return q(n);
64+
case 'a':
65+
return b;
66+
default:
67+
expected('a', 'b');
68+
return null;
69+
}
70+
}
71+
72+
// R → +S | ε
73+
private Node r() {
74+
Node n = new Node('R');
75+
switch (peek()) {
76+
case '+':
77+
n.add(match('+'));
78+
n.add(s());
79+
break;
80+
case 'b':
81+
case '$':
82+
n.add(epsilon());
83+
break;
84+
default:
85+
expected('+', '$', 'b');
86+
}
87+
return n;
88+
}
89+
90+
public static Node parse(String src) {
91+
AbbaParser parser = new AbbaParser(src);
92+
return parser.parse();
93+
}
94+
95+
static void main() {
96+
AbbaParser parser = new AbbaParser("abba");
97+
parser.testParser();
98+
}
99+
100+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package week6.parsers.mini;
2+
3+
import week6.parsers.Node;
4+
import week6.parsers.Parser;
5+
6+
// S → AkT
7+
// A -> aA | ε
8+
// T -> t | tSp | Tt
9+
// R -> tR | ε
10+
public class AktParser extends Parser {
11+
12+
public AktParser(String input) {
13+
super(input);
14+
}
15+
16+
// S → AkT
17+
@Override
18+
protected Node s() {
19+
Node n = new Node('S');
20+
n.add(a());
21+
n.add(match('k'));
22+
n.add(t());
23+
return n;
24+
}
25+
26+
// A -> aA | ε
27+
private Node a() {
28+
Node n = new Node('A');
29+
switch (peek()) {
30+
case 'a':
31+
n.add(match('a'));
32+
n.add(a());
33+
break;
34+
case 'k':
35+
n.add(epsilon());
36+
break;
37+
default:
38+
expected('a', 'k');
39+
}
40+
return n;
41+
}
42+
43+
// T -> t | tSp | Tt
44+
// T -> t (SP|ε) R
45+
private Node t() {
46+
Node n = new Node('T');
47+
n.add(match('t'));
48+
switch (peek()) {
49+
case 'a':
50+
case 'k':
51+
n.add(s());
52+
n.add(match('p'));
53+
break;
54+
case 'p':
55+
case 't':
56+
case '$':
57+
break;
58+
default:
59+
expected('a','k','p','t','$');
60+
}
61+
return r(n);
62+
}
63+
64+
// R -> tR | ε
65+
private Node r(Node n) {
66+
switch (peek()) {
67+
case 't':
68+
Node t = new Node('T');
69+
t.add(n);
70+
t.add(match('t'));
71+
return r(t);
72+
case 'p':
73+
case '$':
74+
return n;
75+
default:
76+
expected('t', 'p', '$');
77+
}
78+
return null;
79+
}
80+
81+
public static Node parse(String src) {
82+
AktParser parser = new AktParser(src);
83+
return parser.parse();
84+
}
85+
86+
}
87+
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package week6.parsers.mini;
2+
3+
import week6.parsers.Node;
4+
import week6.parsers.Parser;
5+
6+
7+
// S → AB
8+
// A → boA | baA | ε
9+
// B → Blo | Bbi | rat
10+
public class BoratParser extends Parser {
11+
12+
public BoratParser(String input) {
13+
super(input);
14+
}
15+
16+
// S → AB
17+
@Override
18+
protected Node s() {
19+
Node n = new Node('S');
20+
n.add(a());
21+
n.add(b());
22+
return n;
23+
}
24+
25+
// A → b(o|a)A | ε
26+
private Node a() {
27+
Node n = new Node('A');
28+
switch (peek()) {
29+
case 'b':
30+
n.add(match('b'));
31+
switch (peek()) {
32+
case 'o' -> n.add(match('o'));
33+
case 'a' -> n.add(match('a'));
34+
default -> expected('o', 'a');
35+
}
36+
n.add(a());
37+
break;
38+
case 'r':
39+
n.add(epsilon());
40+
break;
41+
default:
42+
expected('b', 'r');
43+
}
44+
return n;
45+
}
46+
47+
// B → rat R
48+
private Node b() {
49+
Node n = new Node('B');
50+
n.add(match('r'));
51+
n.add(match('a'));
52+
n.add(match('t'));
53+
return r(n);
54+
}
55+
56+
// R → biR | loR | ε
57+
private Node r(Node n) {
58+
Node b = new Node('B');
59+
b.add(n);
60+
switch (peek()) {
61+
case 'l':
62+
b.add(match('l'));
63+
b.add(match('o'));
64+
return r(b);
65+
case 'b':
66+
b.add(match('b'));
67+
b.add(match('i'));
68+
return r(b);
69+
case '$':
70+
return n;
71+
default:
72+
expected('l', 'b', '$');
73+
}
74+
return null;
75+
}
76+
77+
public static Node parse(String src) {
78+
BoratParser parser = new BoratParser(src);
79+
return parser.parse();
80+
}
81+
82+
}
83+

0 commit comments

Comments
 (0)