Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions java/.mvn/jvm.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
--add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED
9 changes: 9 additions & 0 deletions java/checkstyle-suppressions.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0"?>

<!DOCTYPE suppressions PUBLIC
"-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
"https://checkstyle.org/dtds/suppressions_1_2.dtd">

<suppressions>
<suppress checks="NoEnumTrailingComma" files="Parser.java"/>
</suppressions>
100 changes: 51 additions & 49 deletions java/gherkin-java.razor
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
@helper HandleParserError(IEnumerable<string> expectedTokens, State state)
{<text>
final String stateComment = "State: @state.Id - @Raw(state.Comment)";
List<String> expectedTokens = asList("@Raw(string.Join("\", \"", expectedTokens))");
List<String> expectedTokens = List.of("@Raw(string.Join("\", \"", expectedTokens))");
ParserException error = token.isEOF()
? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
: new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
Expand All @@ -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 <a href=http://https://github.com/gasparnagy/berp>Berp</a>.
* <p>
* Changes to this class will be lost if the code is regenerated.
*/
final class @Model.ParserClassName<T> {
enum TokenType {
None(RuleType.None),
@foreach(var rule in Model.RuleSet.TokenRules)
{<text> @(rule.Name.Replace("#", ""))(RuleType.@(rule.Name.Replace("#", "_"))),
</text>} ;

final RuleType ruleType;

TokenType(RuleType ruleType) {
this.ruleType = ruleType;
}
}

enum RuleType {
None,
@foreach(var rule in Model.RuleSet.Where(r => !r.TempRule))
{<text> @rule.Name.Replace("#", "_"), // @rule.ToString(true)
</text>} ;

}

private final Builder<T> builder;

static final class ParserContext {
final TokenScanner tokenScanner;
final TokenMatcher tokenMatcher;
final Queue<Token> tokenQueue;
final List<ParserException> errors;

ParserContext(TokenScanner tokenScanner, TokenMatcher tokenMatcher, Queue<Token> tokenQueue, List<ParserException> errors) {
this.tokenScanner = tokenScanner;
this.tokenMatcher = tokenMatcher;
this.tokenQueue = tokenQueue;
this.errors = errors;
}
}

Parser(Builder<T> builder) {
this.builder = builder;
}
Expand All @@ -104,7 +68,7 @@ final class @Model.ParserClassName<T> {
ParserContext context = new ParserContext(
tokenScanner,
tokenMatcher,
new LinkedList<>(),
new ArrayDeque<>(),
new ArrayList<>()
);

Expand All @@ -128,7 +92,7 @@ final class @Model.ParserClassName<T> {
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;
}
}
Expand Down Expand Up @@ -191,17 +155,15 @@ final class @Model.ParserClassName<T> {
}

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))
Expand All @@ -215,7 +177,7 @@ final class @Model.ParserClassName<T> {
@:{
if (transition.LookAheadHint != null)
{
@:if (lookahead_@(transition.LookAheadHint.Id)(context, token))
@:if (lookahead_@(transition.LookAheadHint.Id)(context))
@:{
}
foreach(var production in transition.Productions)
Expand All @@ -237,7 +199,7 @@ final class @Model.ParserClassName<T> {
@foreach(var lookAheadHint in Model.RuleSet.LookAheadHints)
{
<text>
private boolean lookahead_@(lookAheadHint.Id)(ParserContext context, Token currentToken) {
private boolean lookahead_@(lookAheadHint.Id)(ParserContext context) {
Token token;
Queue<Token> queue = new ArrayDeque<Token>();
boolean match = false;
Expand Down Expand Up @@ -272,17 +234,57 @@ final class @Model.ParserClassName<T> {

interface Builder<T> {
void build(Token token);

void startRule(RuleType ruleType);

void endRule(RuleType ruleType);

T getResult();

void reset(String uri);
}

interface TokenMatcher {
@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<Token> tokenQueue;
final List<ParserException> errors;

ParserContext(TokenScanner tokenScanner, TokenMatcher tokenMatcher, Queue<Token> tokenQueue, List<ParserException> 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)
{<text> @(rule.Name.Replace("#", ""))(RuleType.@(rule.Name.Replace("#", "_"))),
</text>} ;

final RuleType ruleType;

TokenType(RuleType ruleType) {
this.ruleType = ruleType;
}
}

enum RuleType {
None,
@foreach(var rule in Model.RuleSet.Where(r => !r.TempRule))
{<text> /** @rule.ToString(true) **/
@rule.Name.Replace("#", "_"),
</text>}
}
}
29 changes: 23 additions & 6 deletions java/pom.xml
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-parent</artifactId>
<version>4.5.0</version>
<version>5.0.0-SNAPSHOT</version>
</parent>
<artifactId>gherkin</artifactId>
<version>37.0.1-SNAPSHOT</version>
<version>38.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Gherkin</name>
<description>Gherkin parser</description>
Expand Down Expand Up @@ -56,7 +57,7 @@
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>messages</artifactId>
<version>[31.0.0,32.0.0)</version>
<version>[32.0.0-SNAPSHOT,33.0.0)</version>
</dependency>

<dependency>
Expand Down Expand Up @@ -102,7 +103,7 @@
<version>1.37</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
Expand Down Expand Up @@ -191,7 +192,7 @@
<additionalClasspathElements>
${project.build.directory}/codegen-classes
</additionalClasspathElements>
<mainClass>Generate</mainClass>
<mainClass>io.cucumber.gherkin.dialects.Generate</mainClass>
<arguments>
<argument>${project.build.directory}/generated-sources/gherkin</argument>
<argument>io/cucumber/gherkin</argument>
Expand All @@ -218,6 +219,22 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
<configuration>
<suppressionsLocation>checkstyle-suppressions.xml</suppressionsLocation>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package io.cucumber.gherkin.dialects;

public class Generate {

public static void main(String[] args) throws Exception {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Loading
Loading