Skip to content

Commit 7f87511

Browse files
committed
Dodanie metody getTokenizer() do Parser.java
1 parent f3ba408 commit 7f87511

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

src/main/java/pl/koder95/interpreter/Interpreter.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ public interface Interpreter<C extends Context, R> {
1616
/**
1717
* @return {@link Tokenizer tokenizer} używany przez {@link Parser parser} do budowy drzewa składni
1818
*/
19-
Tokenizer getTokenizer();
19+
default Tokenizer getTokenizer() {
20+
Parser<C, R> parser = getParser();
21+
return parser == null? null : parser.getTokenizer();
22+
}
23+
2024
/**
2125
* @return {@link Parser parser}, który pobiera tokeny, aby stworzyć drzewo składniowe
2226
*/
@@ -35,13 +39,18 @@ public interface Interpreter<C extends Context, R> {
3539
* @param readable dane odczytywane przez tokenizer i zamieniane na postać terminalną
3640
* @return wynik interpretacji
3741
* @throws IllegalStateException w przypadku niedostarczenia parsera lub
38-
* w przypadku niedostarczenia tokenizera przez parser
42+
* w przypadku niedostarczenia tokenizera przez parser albo
43+
* w przypadku niedostarczenia fabryki skanerów
3944
* @throws SyntaxException w przypadku błędów składniowych w dostarczonych danych
4045
*/
4146
default R interpret(Readable readable) {
4247
Tokenizer tokenizer = getTokenizer();
43-
tokenizer.useScanner(getScannerFactory().create(readable));
44-
TerminalExpression<C, R> ast = getParser().buildAbstractSyntaxTree(tokenizer.enqueue());
48+
ScannerFactory factory = getScannerFactory();
49+
if (tokenizer != null && factory != null) tokenizer.useScanner(factory.create(readable));
50+
else throw new IllegalStateException("Cannot use readable when tokenizer or scanner factory are null", new NullPointerException());
51+
Parser<C, R> parser = getParser();
52+
if (parser == null) throw new IllegalStateException("Cannot use readable when parser is null", new NullPointerException());
53+
TerminalExpression<C, R> ast = parser.buildAbstractSyntaxTree();
4554
return ast.interpret(getContext());
4655
}
4756
}

src/main/java/pl/koder95/interpreter/Parser.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,25 @@
99
*/
1010
public interface Parser<C extends Context, R> {
1111

12+
/**
13+
* @return {@link Tokenizer tokenizer} używany do budowy drzewa składni
14+
*/
15+
Tokenizer getTokenizer();
16+
1217
/**
1318
* Buduje drzewo abstrakcyjnej syntaktyki.
1419
* @param tokens dane wejściowe poddane tokenizacji
1520
* @return wyrażenie terminalne najwyższego poziomu
1621
* @throws SyntaxException w przypadku błędów składniowych w dostarczonych danych
1722
*/
1823
TerminalExpression<C, R> buildAbstractSyntaxTree(Queue<NonTerminalExpression<?>> tokens);
24+
25+
/**
26+
* Buduje drzewo abstrakcyjnej syntaktyki, wykorzystując kolejkę tokenów dostarczoną przez tokenizer.
27+
* @return wyrażenie terminalne najwyższego poziomu
28+
* @throws SyntaxException w przypadku błędów składniowych w dostarczonych danych
29+
*/
30+
default TerminalExpression<C, R> buildAbstractSyntaxTree() {
31+
return buildAbstractSyntaxTree(getTokenizer().enqueue());
32+
}
1933
}

0 commit comments

Comments
 (0)