expectedTokens = List.of("@Raw(string.Join("\", \"", expectedTokens))");
ParserException error = token.isEOF()
? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
: new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
@@ -30,57 +30,21 @@ package io.cucumber.gherkin;
import java.util.ArrayDeque;
import java.util.ArrayList;
-import java.util.LinkedList;
import java.util.List;
+import java.util.Objects;
import java.util.Queue;
import java.util.function.BiConsumer;
import java.util.function.BiPredicate;
-import static java.util.Arrays.asList;
-
/**
* This class was generated by Berp.
*
* Changes to this class will be lost if the code is regenerated.
*/
final class @Model.ParserClassName {
- enum TokenType {
- None(RuleType.None),
- @foreach(var rule in Model.RuleSet.TokenRules)
- { @(rule.Name.Replace("#", ""))(RuleType.@(rule.Name.Replace("#", "_"))),
-} ;
-
- final RuleType ruleType;
-
- TokenType(RuleType ruleType) {
- this.ruleType = ruleType;
- }
- }
-
- enum RuleType {
- None,
- @foreach(var rule in Model.RuleSet.Where(r => !r.TempRule))
- { @rule.Name.Replace("#", "_"), // @rule.ToString(true)
-} ;
-
- }
private final Builder builder;
- static final class ParserContext {
- final TokenScanner tokenScanner;
- final TokenMatcher tokenMatcher;
- final Queue tokenQueue;
- final List errors;
-
- ParserContext(TokenScanner tokenScanner, TokenMatcher tokenMatcher, Queue tokenQueue, List errors) {
- this.tokenScanner = tokenScanner;
- this.tokenMatcher = tokenMatcher;
- this.tokenQueue = tokenQueue;
- this.errors = errors;
- }
- }
-
Parser(Builder builder) {
this.builder = builder;
}
@@ -104,7 +68,7 @@ final class @Model.ParserClassName {
ParserContext context = new ParserContext(
tokenScanner,
tokenMatcher,
- new LinkedList<>(),
+ new ArrayDeque<>(),
new ArrayList<>()
);
@@ -128,7 +92,7 @@ final class @Model.ParserClassName {
private void addError(ParserContext context, ParserException error) {
String newErrorMessage = error.getMessage();
for (ParserException e : context.errors) {
- if (e.getMessage().equals(newErrorMessage)) {
+ if (Objects.equals(e.getMessage(), newErrorMessage)) {
return;
}
}
@@ -191,17 +155,15 @@ final class @Model.ParserClassName {
}
private int matchToken(int state, Token token, ParserContext context) {
- int newState;
- switch (state) {
+ int newState = switch (state) {
@foreach(var state in Model.States.Values.Where(s => !s.IsEndState))
{
- @:case @state.Id:
- @:newState = matchTokenAt_@(state.Id)(token, context);
- @:break;
+ @:case @state.Id -> matchTokenAt_@(state.Id)(token, context);
}
- default:
+ default -> {
throw new IllegalStateException("Unknown state: " + state);
- }
+ }
+ };
return newState;
}
@foreach(var state in Model.States.Values.Where(s => !s.IsEndState))
@@ -215,7 +177,7 @@ final class @Model.ParserClassName {
@:{
if (transition.LookAheadHint != null)
{
- @:if (lookahead_@(transition.LookAheadHint.Id)(context, token))
+ @:if (lookahead_@(transition.LookAheadHint.Id)(context))
@:{
}
foreach(var production in transition.Productions)
@@ -237,7 +199,7 @@ final class @Model.ParserClassName {
@foreach(var lookAheadHint in Model.RuleSet.LookAheadHints)
{
- private boolean lookahead_@(lookAheadHint.Id)(ParserContext context, Token currentToken) {
+ private boolean lookahead_@(lookAheadHint.Id)(ParserContext context) {
Token token;
Queue queue = new ArrayDeque();
boolean match = false;
@@ -272,9 +234,13 @@ final class @Model.ParserClassName {
interface Builder {
void build(Token token);
+
void startRule(RuleType ruleType);
+
void endRule(RuleType ruleType);
+
T getResult();
+
void reset(String uri);
}
@@ -282,7 +248,43 @@ final class @Model.ParserClassName {
@foreach(var rule in Model.RuleSet.TokenRules)
{
@:boolean match_@(rule.Name.Replace("#", ""))(Token token);
+ @:
}
void reset();
}
+
+ static final class ParserContext {
+ final TokenScanner tokenScanner;
+ final TokenMatcher tokenMatcher;
+ final Queue tokenQueue;
+ final List errors;
+
+ ParserContext(TokenScanner tokenScanner, TokenMatcher tokenMatcher, Queue tokenQueue, List errors) {
+ this.tokenScanner = tokenScanner;
+ this.tokenMatcher = tokenMatcher;
+ this.tokenQueue = tokenQueue;
+ this.errors = errors;
+ }
+ }
+
+ enum TokenType {
+ None(RuleType.None),
+ @foreach(var rule in Model.RuleSet.TokenRules)
+ { @(rule.Name.Replace("#", ""))(RuleType.@(rule.Name.Replace("#", "_"))),
+} ;
+
+ final RuleType ruleType;
+
+ TokenType(RuleType ruleType) {
+ this.ruleType = ruleType;
+ }
+ }
+
+ enum RuleType {
+ None,
+ @foreach(var rule in Model.RuleSet.Where(r => !r.TempRule))
+ { /** @rule.ToString(true) **/
+ @rule.Name.Replace("#", "_"),
+}
+ }
}
diff --git a/java/pom.xml b/java/pom.xml
index 8057647e1..5e83f8936 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -1,14 +1,15 @@
-
+
4.0.0
io.cucumber
cucumber-parent
- 4.5.0
+ 5.0.0-SNAPSHOT
gherkin
- 37.0.1-SNAPSHOT
+ 38.0.0-SNAPSHOT
jar
Gherkin
Gherkin parser
@@ -56,7 +57,7 @@
io.cucumber
messages
- [31.0.0,32.0.0)
+ [32.0.0-SNAPSHOT,33.0.0)
@@ -102,7 +103,7 @@
1.37
test
-
+
org.openjdk.jmh
jmh-generator-annprocess
@@ -191,7 +192,7 @@
${project.build.directory}/codegen-classes
- Generate
+ io.cucumber.gherkin.dialects.Generate
${project.build.directory}/generated-sources/gherkin
io/cucumber/gherkin
@@ -218,6 +219,22 @@
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+
+
+ validate
+ validate
+
+ check
+
+
+ checkstyle-suppressions.xml
+
+
+
+
diff --git a/java/src/codegen/java/Generate.java b/java/src/codegen/java/io/cucumber/gherkin/dialects/Generate.java
similarity index 91%
rename from java/src/codegen/java/Generate.java
rename to java/src/codegen/java/io/cucumber/gherkin/dialects/Generate.java
index 7e302cf1d..db76fa914 100644
--- a/java/src/codegen/java/Generate.java
+++ b/java/src/codegen/java/io/cucumber/gherkin/dialects/Generate.java
@@ -1,3 +1,5 @@
+package io.cucumber.gherkin.dialects;
+
public class Generate {
public static void main(String[] args) throws Exception {
diff --git a/java/src/codegen/java/GenerateGherkinDialects.java b/java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateGherkinDialects.java
similarity index 98%
rename from java/src/codegen/java/GenerateGherkinDialects.java
rename to java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateGherkinDialects.java
index bae73c1b5..81b013c77 100644
--- a/java/src/codegen/java/GenerateGherkinDialects.java
+++ b/java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateGherkinDialects.java
@@ -1,3 +1,5 @@
+package io.cucumber.gherkin.dialects;
+
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import freemarker.template.Configuration;
diff --git a/java/src/codegen/java/GenerateKeywordMatchers.java b/java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateKeywordMatchers.java
similarity index 83%
rename from java/src/codegen/java/GenerateKeywordMatchers.java
rename to java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateKeywordMatchers.java
index 723ab0c9f..aaf638334 100644
--- a/java/src/codegen/java/GenerateKeywordMatchers.java
+++ b/java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateKeywordMatchers.java
@@ -1,3 +1,5 @@
+package io.cucumber.gherkin.dialects;
+
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import freemarker.template.Configuration;
@@ -21,7 +23,6 @@
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
-import java.util.function.BinaryOperator;
import java.util.stream.Collectors;
import static io.cucumber.messages.types.StepKeywordType.ACTION;
@@ -35,6 +36,7 @@
import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;
import static java.util.Comparator.naturalOrder;
import static java.util.Map.Entry.comparingByKey;
+import static java.util.Objects.requireNonNull;
/*
* This class generates the KeywordMatchers class using the FreeMarker
@@ -74,7 +76,7 @@ private static Template readTemplate() throws IOException {
private static Map readGherkinLanguages() throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
- TypeReference