Skip to content

Commit 9945064

Browse files
committed
инкрементальный парсер
1 parent 75e219d commit 9945064

File tree

3 files changed

+33
-22
lines changed

3 files changed

+33
-22
lines changed

src/main/java/com/github/_1c_syntax/bsl/parser/testing/TestLexer.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import lombok.SneakyThrows;
2626
import org.antlr.v4.runtime.CharStream;
2727
import org.antlr.v4.runtime.CharStreams;
28-
import org.antlr.v4.runtime.CommonTokenStream;
2928
import org.antlr.v4.runtime.ConsoleErrorListener;
29+
import org.antlr.v4.runtime.IncrementalTokenStream;
3030
import org.antlr.v4.runtime.Lexer;
3131
import org.antlr.v4.runtime.Token;
3232
import org.antlr.v4.runtime.UnicodeBOMInputStream;
@@ -71,7 +71,7 @@ public TestLexer(Class<T> clazz) {
7171
/**
7272
* Возвращает список токенов в переданной строке
7373
*
74-
* @param mode Режим
74+
* @param mode Режим
7575
* @param inputString Входная строка
7676
* @return Токены в строке
7777
*/
@@ -82,11 +82,11 @@ public List<Token> getTokens(int mode, String inputString) {
8282
/**
8383
* Возвращает токены переданной строки
8484
*
85-
* @param mode Режим
85+
* @param mode Режим
8686
* @param inputString Входная строка
8787
* @return Токены в строке
8888
*/
89-
public CommonTokenStream getTokensStream(int mode, String inputString) {
89+
public IncrementalTokenStream getTokensStream(int mode, String inputString) {
9090
CharStream input;
9191

9292
try (
@@ -104,7 +104,7 @@ public CommonTokenStream getTokensStream(int mode, String inputString) {
104104
lexer.removeErrorListener(ConsoleErrorListener.INSTANCE);
105105
lexer.pushMode(mode);
106106

107-
var tempTokenStream = new CommonTokenStream(lexer);
107+
var tempTokenStream = new IncrementalTokenStream(lexer);
108108
tempTokenStream.fill();
109109

110110
return tempTokenStream;
@@ -147,7 +147,7 @@ public LexerAsserts assertThat(String inputString) {
147147
/**
148148
* Настраивает и запоминает тестируемый контекст. Использует дефолтное channel
149149
*
150-
* @param mode Режим
150+
* @param mode Режим
151151
* @param inputString анализируемая строка
152152
* @return служебный класс для замыкания
153153
*/
@@ -158,7 +158,7 @@ public LexerAsserts assertThat(int mode, String inputString) {
158158
/**
159159
* Настраивает и запоминает тестируемый контекст
160160
*
161-
* @param mode Режим
161+
* @param mode Режим
162162
* @param inputString анализируемая строка
163163
* @param channel анализируемая строка
164164
* @return служебный класс для замыкания
@@ -171,7 +171,7 @@ public LexerAsserts assertThat(int mode, String inputString, int channel) {
171171
* Настраивает и запоминает тестируемый контекст. Использует дефолтное mode
172172
*
173173
* @param inputString анализируемая строка
174-
* @param channel Канал
174+
* @param channel Канал
175175
* @return служебный класс для замыкания
176176
*/
177177
public LexerAsserts assertThat(String inputString, int channel) {

src/main/java/com/github/_1c_syntax/bsl/parser/testing/TestParser.java

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import lombok.Getter;
2525
import lombok.SneakyThrows;
2626
import lombok.experimental.Accessors;
27+
import org.antlr.v4.runtime.IncrementalParser;
28+
import org.antlr.v4.runtime.IncrementalTokenStream;
2729
import org.antlr.v4.runtime.Lexer;
2830
import org.antlr.v4.runtime.Parser;
2931
import org.antlr.v4.runtime.TokenStream;
@@ -33,25 +35,27 @@
3335
import java.util.Collections;
3436
import java.util.List;
3537

36-
public class TestParser<P extends Parser, L extends Lexer> {
38+
public class TestParser<PARSER extends Parser, LEXER extends Lexer> {
3739

3840
private final List<String> ruleNames;
3941

4042
@Getter
41-
private final TestLexer<L> lexer;
43+
private final TestLexer<LEXER> lexer;
4244

4345
@Getter
44-
private final Class<P> parserClazz;
46+
private final Class<PARSER> parserClazz;
4547

4648
@Getter
47-
private final Class<L> lexerClazz;
49+
private final Class<LEXER> lexerClazz;
4850

4951
@Getter
5052
@Accessors(fluent = true)
51-
private P parser;
53+
private PARSER parser;
54+
55+
private final boolean supportRebuild;
5256

5357
@SneakyThrows
54-
public TestParser(Class<P> parserClazz, Class<L> lexerClazz) {
58+
public TestParser(Class<PARSER> parserClazz, Class<LEXER> lexerClazz) {
5559
this.lexer = new TestLexer<>(lexerClazz);
5660
this.parserClazz = parserClazz;
5761
this.lexerClazz = lexerClazz;
@@ -64,6 +68,8 @@ public TestParser(Class<P> parserClazz, Class<L> lexerClazz) {
6468
} else {
6569
ruleNames = Collections.emptyList();
6670
}
71+
72+
this.supportRebuild = IncrementalParser.class.isAssignableFrom(parserClazz);
6773
}
6874

6975
/**
@@ -87,14 +93,14 @@ public String ruleName(Integer type) {
8793
* @return служебный класс для замыкания
8894
*/
8995
public ParserAsserts assertThat(String inputString) {
90-
parser = createParser(L.DEFAULT_MODE, inputString);
96+
parser = createParser(LEXER.DEFAULT_MODE, inputString);
9197
return new ParserAsserts(this, parser);
9298
}
9399

94100
/**
95101
* Настраивает и запоминает тестируемый контекст. Использует дефолтное channel
96102
*
97-
* @param mode Режим
103+
* @param mode Режим
98104
* @param inputString анализируемая строка
99105
* @return служебный класс для замыкания
100106
*/
@@ -110,15 +116,20 @@ public ParserAsserts assertThat(int mode, String inputString) {
110116
* @return служебный класс для замыкания
111117
*/
112118
public ParserAsserts assertThatFile(String sourcePath) {
113-
parser = createParser(L.DEFAULT_MODE, ResourceUtils.byName(sourcePath));
119+
parser = createParser(LEXER.DEFAULT_MODE, ResourceUtils.byName(sourcePath));
114120
return new ParserAsserts(this, parser);
115121
}
116122

117-
private P createParser(int mode, String inputString) {
123+
private PARSER createParser(int mode, String inputString) {
118124
var tokenStream = getLexer().getTokensStream(mode, inputString);
119125
try {
120-
return parserClazz.getDeclaredConstructor(TokenStream.class)
121-
.newInstance(tokenStream);
126+
if (supportRebuild) {
127+
return parserClazz.getDeclaredConstructor(IncrementalTokenStream.class)
128+
.newInstance(tokenStream);
129+
} else {
130+
return parserClazz.getDeclaredConstructor(TokenStream.class)
131+
.newInstance(tokenStream);
132+
}
122133
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
123134
throw new RuntimeException(e);
124135
}

src/test/java/com/github/_1c_syntax/bsl/parser/testing/TestParserTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import com.github._1c_syntax.bsl.parser.testing.demo.DemoEmptyParser;
2525
import com.github._1c_syntax.bsl.parser.testing.demo.DemoLexer;
2626
import com.github._1c_syntax.bsl.parser.testing.demo.DemoParser;
27-
import org.antlr.v4.runtime.CommonTokenStream;
27+
import org.antlr.v4.runtime.IncrementalTokenStream;
2828
import org.junit.jupiter.api.Test;
2929

3030
import java.util.List;
@@ -65,7 +65,7 @@ void testAssert() {
6565
var testParser = spy(new TestParser<>(DemoParser.class, DemoLexer.class));
6666

6767
var testLexer = spy(new TestLexer<>(DemoLexer.class));
68-
doReturn(new CommonTokenStream(testLexer.getLexer()))
68+
doReturn(new IncrementalTokenStream(testLexer.getLexer()))
6969
.when(testLexer).getTokensStream(DemoLexer.DEFAULT_MODE, "");
7070

7171
doReturn(testLexer).when(testParser).getLexer();

0 commit comments

Comments
 (0)