@@ -16,7 +16,11 @@ public interface Interpreter<C extends Context, R> {
16
16
/**
17
17
* @return {@link Tokenizer tokenizer} używany przez {@link Parser parser} do budowy drzewa składni
18
18
*/
19
- Tokenizer getTokenizer ();
19
+ default Tokenizer getTokenizer () {
20
+ Parser <C , R > parser = getParser ();
21
+ return parser == null ? null : parser .getTokenizer ();
22
+ }
23
+
20
24
/**
21
25
* @return {@link Parser parser}, który pobiera tokeny, aby stworzyć drzewo składniowe
22
26
*/
@@ -35,13 +39,18 @@ public interface Interpreter<C extends Context, R> {
35
39
* @param readable dane odczytywane przez tokenizer i zamieniane na postać terminalną
36
40
* @return wynik interpretacji
37
41
* @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
39
44
* @throws SyntaxException w przypadku błędów składniowych w dostarczonych danych
40
45
*/
41
46
default R interpret (Readable readable ) {
42
47
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 ();
45
54
return ast .interpret (getContext ());
46
55
}
47
56
}
0 commit comments