Skip to content

Commit 80616b6

Browse files
authored
Поддержка инкрементального парсера (#52)
* инкрементальный парсер * antl with inc * фикс версии
1 parent 75e219d commit 80616b6

File tree

4 files changed

+37
-26
lines changed

4 files changed

+37
-26
lines changed

build.gradle.kts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,12 @@ gitVersioning.apply {
4949
}
5050

5151
dependencies {
52-
implementation("io.github.1c-syntax", "antlr4", "0.2.0-rc.1")
52+
implementation("io.github.1c-syntax", "antlr4", "0.2.0-alpha.1")
5353
implementation("commons-io", "commons-io", "2.15.1")
54-
implementation("org.junit.jupiter", "junit-jupiter-api", "5.10.1")
55-
implementation("org.assertj", "assertj-core", "3.25.0")
54+
implementation("org.junit.jupiter", "junit-jupiter-api", "5.11.4")
55+
implementation("org.assertj", "assertj-core", "3.27.0")
5656

57-
testImplementation("org.junit.jupiter", "junit-jupiter-engine", "5.10.1")
57+
testImplementation("org.junit.jupiter", "junit-jupiter-engine", "5.11.4")
5858
testImplementation("org.mockito", "mockito-core", "5.8.0")
5959
}
6060

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)