27
27
import org .antlr .v4 .runtime .CommonToken ;
28
28
import org .antlr .v4 .runtime .CommonTokenStream ;
29
29
import org .antlr .v4 .runtime .ConsoleErrorListener ;
30
+ import org .antlr .v4 .runtime .IntStream ;
30
31
import org .antlr .v4 .runtime .Lexer ;
31
32
import org .antlr .v4 .runtime .Parser ;
32
33
import org .antlr .v4 .runtime .Token ;
36
37
37
38
import java .io .IOException ;
38
39
import java .io .InputStream ;
39
- import java .io .InputStreamReader ;
40
- import java .io .Reader ;
41
40
import java .lang .reflect .InvocationTargetException ;
41
+ import java .lang .reflect .Method ;
42
42
import java .nio .charset .StandardCharsets ;
43
43
import java .util .ArrayList ;
44
+ import java .util .Arrays ;
44
45
import java .util .List ;
46
+ import java .util .Optional ;
45
47
46
48
import static java .util .Objects .requireNonNull ;
47
49
import static org .antlr .v4 .runtime .Token .EOF ;
@@ -62,6 +64,8 @@ public abstract class Tokenizer<T extends BSLParserRuleContext, P extends Parser
62
64
private final Class <P > parserClass ;
63
65
protected P parser ;
64
66
67
+ private final Optional <Method > setInputStreamMethod ;
68
+
65
69
protected Tokenizer (String content , Lexer lexer , Class <P > parserClass ) {
66
70
this (IOUtils .toInputStream (content , StandardCharsets .UTF_8 ), lexer , parserClass );
67
71
}
@@ -72,6 +76,11 @@ protected Tokenizer(InputStream content, Lexer lexer, Class<P> parserClass) {
72
76
this .content = content ;
73
77
this .lexer = lexer ;
74
78
this .parserClass = parserClass ;
79
+ var methods = lexer .getClass ().getMethods ();
80
+ setInputStreamMethod = Arrays .stream (methods )
81
+ .filter (method -> "setInputStream" .equals (method .getName ())
82
+ && method .getParameterCount () == 1
83
+ && method .getParameterTypes ()[0 ] == IntStream .class ).findFirst ();
75
84
}
76
85
77
86
/**
@@ -85,6 +94,7 @@ public List<Token> getTokens() {
85
94
86
95
/**
87
96
* Возвращает абстрактное синтаксическое дерево, полученное на основании парсинга
97
+ *
88
98
* @return AST
89
99
*/
90
100
public T getAst () {
@@ -123,15 +133,23 @@ private CommonTokenStream computeTokenStream() {
123
133
124
134
try (
125
135
var ubis = new UnicodeBOMInputStream (content );
126
- Reader inputStreamReader = new InputStreamReader (ubis , StandardCharsets .UTF_8 )
127
136
) {
128
137
ubis .skipBOM ();
129
- input = CharStreams .fromReader ( inputStreamReader );
138
+ input = CharStreams .fromStream ( ubis );
130
139
} catch (IOException e ) {
131
140
throw new RuntimeException (e );
132
141
}
133
142
134
- lexer .setInputStream (input );
143
+ if (setInputStreamMethod .isPresent ()) {
144
+ try {
145
+ setInputStreamMethod .get ().invoke (lexer , input );
146
+ } catch (IllegalAccessException | InvocationTargetException e ) {
147
+ throw new RuntimeException (e );
148
+ }
149
+ } else {
150
+ lexer .setInputStream (input );
151
+ }
152
+
135
153
lexer .removeErrorListener (ConsoleErrorListener .INSTANCE );
136
154
137
155
var tempTokenStream = new CommonTokenStream (lexer );
0 commit comments