All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gherkin.Parser Maven / Gradle / Ivy

The newest version!
//      This code was generated by Berp (http://https://github.com/gasparnagy/berp/).
//
//      Changes to this file may cause incorrect behavior and will be lost if
//      the code is regenerated.


package gherkin;

import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

import static java.util.Arrays.asList;

public class Parser {
    public enum TokenType {
        None,
        EOF,
        Empty,
        Comment,
        TagLine,
        FeatureLine,
        BackgroundLine,
        ScenarioLine,
        ScenarioOutlineLine,
        ExamplesLine,
        StepLine,
        DocStringSeparator,
        TableRow,
        Language,
        Other,
        ;
    }

    public enum RuleType {
        None,
        _EOF, // #EOF
        _Empty, // #Empty
        _Comment, // #Comment
        _TagLine, // #TagLine
        _FeatureLine, // #FeatureLine
        _BackgroundLine, // #BackgroundLine
        _ScenarioLine, // #ScenarioLine
        _ScenarioOutlineLine, // #ScenarioOutlineLine
        _ExamplesLine, // #ExamplesLine
        _StepLine, // #StepLine
        _DocStringSeparator, // #DocStringSeparator
        _TableRow, // #TableRow
        _Language, // #Language
        _Other, // #Other
        Feature, // Feature! := Feature_Header Background? Scenario_Definition*
        Feature_Header, // Feature_Header! := #Language? Tags? #FeatureLine Feature_Description
        Background, // Background! := #BackgroundLine Background_Description Scenario_Step*
        Scenario_Definition, // Scenario_Definition! := Tags? (Scenario | ScenarioOutline)
        Scenario, // Scenario! := #ScenarioLine Scenario_Description Scenario_Step*
        ScenarioOutline, // ScenarioOutline! := #ScenarioOutlineLine ScenarioOutline_Description ScenarioOutline_Step* Examples_Definition+
        Examples_Definition, // Examples_Definition! [#Empty|#Comment|#TagLine->#ExamplesLine] := Tags? Examples
        Examples, // Examples! := #ExamplesLine Examples_Description #TableRow #TableRow+
        Scenario_Step, // Scenario_Step := Step
        ScenarioOutline_Step, // ScenarioOutline_Step := Step
        Step, // Step! := #StepLine Step_Arg?
        Step_Arg, // Step_Arg := (DataTable | DocString)
        DataTable, // DataTable! := #TableRow+
        DocString, // DocString! := #DocStringSeparator #Other* #DocStringSeparator
        Tags, // Tags! := #TagLine+
        Feature_Description, // Feature_Description := Description_Helper
        Background_Description, // Background_Description := Description_Helper
        Scenario_Description, // Scenario_Description := Description_Helper
        ScenarioOutline_Description, // ScenarioOutline_Description := Description_Helper
        Examples_Description, // Examples_Description := Description_Helper
        Description_Helper, // Description_Helper := #Empty* Description? #Comment*
        Description, // Description! := #Other+
        ;

        public static RuleType cast(TokenType tokenType) {
            return RuleType.values()[tokenType.ordinal()];
        }
    }

    private final Builder builder;

    public boolean stopAtFirstError;

    class ParserContext {
        public final ITokenScanner tokenScanner;
        public final ITokenMatcher tokenMatcher;
        public final Queue tokenQueue;
        public final List errors;

        ParserContext(ITokenScanner tokenScanner, ITokenMatcher tokenMatcher, Queue tokenQueue, List errors) {
            this.tokenScanner = tokenScanner;
            this.tokenMatcher = tokenMatcher;
            this.tokenQueue = tokenQueue;
            this.errors = errors;
        }
    }

    public Parser(Builder builder) {
        this.builder = builder;
    }

    public T parse(String source) {
        return parse(new StringReader(source));
    }

    public T parse(Reader source) {
        return parse(new TokenScanner(source));
    }

    public T parse(ITokenScanner tokenScanner) {
        return parse(tokenScanner, new TokenMatcher());
    }

    public T parse(String source, ITokenMatcher tokenMatcher) {
        return parse(new StringReader(source), tokenMatcher);
    }

    public T parse(Reader source, ITokenMatcher tokenMatcher) {
        return parse(new TokenScanner(source), tokenMatcher);
    }

    public T parse(ITokenScanner tokenScanner, ITokenMatcher tokenMatcher) {
        builder.reset();
        tokenMatcher.reset();

        ParserContext context = new ParserContext(
                tokenScanner,
                tokenMatcher,
                new LinkedList(),
                new ArrayList()
        );

        startRule(context, RuleType.Feature);
        int state = 0;
        Token token;
        do {
            token = readToken(context);
            state = matchToken(state, token, context);
        } while (!token.isEOF());

        endRule(context, RuleType.Feature);

        if (context.errors.size() > 0) {
            throw new ParserException.CompositeParserException(context.errors);
        }

        return builder.getResult();
    }

    private void addError(ParserContext context, ParserException error) {
        context.errors.add(error);
        if (context.errors.size() > 10)
            throw new ParserException.CompositeParserException(context.errors);
    }

    private  V handleAstError(ParserContext context, final Func action) {
        return handleExternalError(context, action, null);
    }

    private  V handleExternalError(ParserContext context, Func action, V defaultValue) {
        if (stopAtFirstError) {
            return action.call();
        }

        try {
            return action.call();
        } catch (ParserException.CompositeParserException compositeParserException) {
            for (ParserException error : compositeParserException.errors) {
                addError(context, error);
            }
        } catch (ParserException error) {
            addError(context, error);
        }
        return defaultValue;
    }

    private void build(final ParserContext context, final Token token) {
        handleAstError(context, new Func() {
            public Void call() {
                builder.build(token);
                return null;
            }
        });
    }

    private void startRule(final ParserContext context, final RuleType ruleType) {
        handleAstError(context, new Func() {
            public Void call() {
                builder.startRule(ruleType);
                return null;
            }
        });
    }

    private void endRule(final ParserContext context, final RuleType ruleType) {
        handleAstError(context, new Func() {
            public Void call() {
                builder.endRule(ruleType);
                return null;
            }
        });
    }

    private Token readToken(ParserContext context) {
        return context.tokenQueue.size() > 0 ? context.tokenQueue.remove() : context.tokenScanner.read();
    }


    private boolean match_EOF(final ParserContext context, final Token token) {
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_EOF(token);
            }
        }, false);
    }

    private boolean match_Empty(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_Empty(token);
            }
        }, false);
    }

    private boolean match_Comment(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_Comment(token);
            }
        }, false);
    }

    private boolean match_TagLine(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_TagLine(token);
            }
        }, false);
    }

    private boolean match_FeatureLine(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_FeatureLine(token);
            }
        }, false);
    }

    private boolean match_BackgroundLine(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_BackgroundLine(token);
            }
        }, false);
    }

    private boolean match_ScenarioLine(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_ScenarioLine(token);
            }
        }, false);
    }

    private boolean match_ScenarioOutlineLine(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_ScenarioOutlineLine(token);
            }
        }, false);
    }

    private boolean match_ExamplesLine(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_ExamplesLine(token);
            }
        }, false);
    }

    private boolean match_StepLine(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_StepLine(token);
            }
        }, false);
    }

    private boolean match_DocStringSeparator(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_DocStringSeparator(token);
            }
        }, false);
    }

    private boolean match_TableRow(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_TableRow(token);
            }
        }, false);
    }

    private boolean match_Language(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_Language(token);
            }
        }, false);
    }

    private boolean match_Other(final ParserContext context, final Token token) {
        if (token.isEOF()) return false;
        return handleExternalError(context, new Func() {
            public Boolean call() {
                return context.tokenMatcher.match_Other(token);
            }
        }, false);
    }

    private int matchToken(int state, Token token, ParserContext context) {
        int newState;
        switch(state) {
            case 0:
                newState = matchTokenAt_0(token, context);
                break;
            case 1:
                newState = matchTokenAt_1(token, context);
                break;
            case 2:
                newState = matchTokenAt_2(token, context);
                break;
            case 3:
                newState = matchTokenAt_3(token, context);
                break;
            case 4:
                newState = matchTokenAt_4(token, context);
                break;
            case 5:
                newState = matchTokenAt_5(token, context);
                break;
            case 6:
                newState = matchTokenAt_6(token, context);
                break;
            case 7:
                newState = matchTokenAt_7(token, context);
                break;
            case 8:
                newState = matchTokenAt_8(token, context);
                break;
            case 9:
                newState = matchTokenAt_9(token, context);
                break;
            case 10:
                newState = matchTokenAt_10(token, context);
                break;
            case 11:
                newState = matchTokenAt_11(token, context);
                break;
            case 12:
                newState = matchTokenAt_12(token, context);
                break;
            case 13:
                newState = matchTokenAt_13(token, context);
                break;
            case 14:
                newState = matchTokenAt_14(token, context);
                break;
            case 15:
                newState = matchTokenAt_15(token, context);
                break;
            case 16:
                newState = matchTokenAt_16(token, context);
                break;
            case 17:
                newState = matchTokenAt_17(token, context);
                break;
            case 18:
                newState = matchTokenAt_18(token, context);
                break;
            case 19:
                newState = matchTokenAt_19(token, context);
                break;
            case 20:
                newState = matchTokenAt_20(token, context);
                break;
            case 21:
                newState = matchTokenAt_21(token, context);
                break;
            case 22:
                newState = matchTokenAt_22(token, context);
                break;
            case 23:
                newState = matchTokenAt_23(token, context);
                break;
            case 24:
                newState = matchTokenAt_24(token, context);
                break;
            case 25:
                newState = matchTokenAt_25(token, context);
                break;
            case 26:
                newState = matchTokenAt_26(token, context);
                break;
            case 27:
                newState = matchTokenAt_27(token, context);
                break;
            case 29:
                newState = matchTokenAt_29(token, context);
                break;
            case 30:
                newState = matchTokenAt_30(token, context);
                break;
            case 31:
                newState = matchTokenAt_31(token, context);
                break;
            case 32:
                newState = matchTokenAt_32(token, context);
                break;
            case 33:
                newState = matchTokenAt_33(token, context);
                break;
            case 34:
                newState = matchTokenAt_34(token, context);
                break;
            default:
                throw new IllegalStateException("Unknown state: " + state);
        }
        return newState;
    }


    // Start
    private int matchTokenAt_0(Token token, ParserContext context) {
        if (match_Language(context, token))
        {
                startRule(context, RuleType.Feature_Header);
                build(context, token);
            return 1;
        }
        if (match_TagLine(context, token))
        {
                startRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 2;
        }
        if (match_FeatureLine(context, token))
        {
                startRule(context, RuleType.Feature_Header);
                build(context, token);
            return 3;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 0;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 0;
        }
        
        final String stateComment = "State: 0 - Start";
        token.detach();
        List expectedTokens = asList("#Language", "#TagLine", "#FeatureLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 0;

    }


    // Feature:0>Feature_Header:0>#Language:0
    private int matchTokenAt_1(Token token, ParserContext context) {
        if (match_TagLine(context, token))
        {
                startRule(context, RuleType.Tags);
                build(context, token);
            return 2;
        }
        if (match_FeatureLine(context, token))
        {
                build(context, token);
            return 3;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 1;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 1;
        }
        
        final String stateComment = "State: 1 - Feature:0>Feature_Header:0>#Language:0";
        token.detach();
        List expectedTokens = asList("#TagLine", "#FeatureLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 1;

    }


    // Feature:0>Feature_Header:1>Tags:0>#TagLine:0
    private int matchTokenAt_2(Token token, ParserContext context) {
        if (match_TagLine(context, token))
        {
                build(context, token);
            return 2;
        }
        if (match_FeatureLine(context, token))
        {
                endRule(context, RuleType.Tags);
                build(context, token);
            return 3;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 2;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 2;
        }
        
        final String stateComment = "State: 2 - Feature:0>Feature_Header:1>Tags:0>#TagLine:0";
        token.detach();
        List expectedTokens = asList("#TagLine", "#FeatureLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 2;

    }


    // Feature:0>Feature_Header:2>#FeatureLine:0
    private int matchTokenAt_3(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Feature_Header);
                build(context, token);
            return 28;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 3;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 5;
        }
        if (match_BackgroundLine(context, token))
        {
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Background);
                build(context, token);
            return 6;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Other(context, token))
        {
                startRule(context, RuleType.Description);
                build(context, token);
            return 4;
        }
        
        final String stateComment = "State: 3 - Feature:0>Feature_Header:2>#FeatureLine:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#Empty", "#Comment", "#BackgroundLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 3;

    }


    // Feature:0>Feature_Header:3>Feature_Description:0>Description_Helper:1>Description:0>#Other:0
    private int matchTokenAt_4(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Feature_Header);
                build(context, token);
            return 28;
        }
        if (match_Comment(context, token))
        {
                endRule(context, RuleType.Description);
                build(context, token);
            return 5;
        }
        if (match_BackgroundLine(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Background);
                build(context, token);
            return 6;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Other(context, token))
        {
                build(context, token);
            return 4;
        }
        
        final String stateComment = "State: 4 - Feature:0>Feature_Header:3>Feature_Description:0>Description_Helper:1>Description:0>#Other:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#Comment", "#BackgroundLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 4;

    }


    // Feature:0>Feature_Header:3>Feature_Description:0>Description_Helper:2>#Comment:0
    private int matchTokenAt_5(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Feature_Header);
                build(context, token);
            return 28;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 5;
        }
        if (match_BackgroundLine(context, token))
        {
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Background);
                build(context, token);
            return 6;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Feature_Header);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 5;
        }
        
        final String stateComment = "State: 5 - Feature:0>Feature_Header:3>Feature_Description:0>Description_Helper:2>#Comment:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#Comment", "#BackgroundLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 5;

    }


    // Feature:1>Background:0>#BackgroundLine:0
    private int matchTokenAt_6(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Background);
                build(context, token);
            return 28;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 6;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 8;
        }
        if (match_StepLine(context, token))
        {
                startRule(context, RuleType.Step);
                build(context, token);
            return 9;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Other(context, token))
        {
                startRule(context, RuleType.Description);
                build(context, token);
            return 7;
        }
        
        final String stateComment = "State: 6 - Feature:1>Background:0>#BackgroundLine:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#Empty", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 6;

    }


    // Feature:1>Background:1>Background_Description:0>Description_Helper:1>Description:0>#Other:0
    private int matchTokenAt_7(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Background);
                build(context, token);
            return 28;
        }
        if (match_Comment(context, token))
        {
                endRule(context, RuleType.Description);
                build(context, token);
            return 8;
        }
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.Description);
                startRule(context, RuleType.Step);
                build(context, token);
            return 9;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Other(context, token))
        {
                build(context, token);
            return 7;
        }
        
        final String stateComment = "State: 7 - Feature:1>Background:1>Background_Description:0>Description_Helper:1>Description:0>#Other:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 7;

    }


    // Feature:1>Background:1>Background_Description:0>Description_Helper:2>#Comment:0
    private int matchTokenAt_8(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Background);
                build(context, token);
            return 28;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 8;
        }
        if (match_StepLine(context, token))
        {
                startRule(context, RuleType.Step);
                build(context, token);
            return 9;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 8;
        }
        
        final String stateComment = "State: 8 - Feature:1>Background:1>Background_Description:0>Description_Helper:2>#Comment:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 8;

    }


    // Feature:1>Background:2>Scenario_Step:0>Step:0>#StepLine:0
    private int matchTokenAt_9(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                build(context, token);
            return 28;
        }
        if (match_TableRow(context, token))
        {
                startRule(context, RuleType.DataTable);
                build(context, token);
            return 10;
        }
        if (match_DocStringSeparator(context, token))
        {
                startRule(context, RuleType.DocString);
                build(context, token);
            return 33;
        }
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Step);
                build(context, token);
            return 9;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 9;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 9;
        }
        
        final String stateComment = "State: 9 - Feature:1>Background:2>Scenario_Step:0>Step:0>#StepLine:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 9;

    }


    // Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0
    private int matchTokenAt_10(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                build(context, token);
            return 28;
        }
        if (match_TableRow(context, token))
        {
                build(context, token);
            return 10;
        }
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Step);
                build(context, token);
            return 9;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 10;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 10;
        }
        
        final String stateComment = "State: 10 - Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#TableRow", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 10;

    }


    // Feature:2>Scenario_Definition:0>Tags:0>#TagLine:0
    private int matchTokenAt_11(Token token, ParserContext context) {
        if (match_TagLine(context, token))
        {
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Tags);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Tags);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 11;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 11;
        }
        
        final String stateComment = "State: 11 - Feature:2>Scenario_Definition:0>Tags:0>#TagLine:0";
        token.detach();
        List expectedTokens = asList("#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 11;

    }


    // Feature:2>Scenario_Definition:1>__alt0:0>Scenario:0>#ScenarioLine:0
    private int matchTokenAt_12(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                build(context, token);
            return 28;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 12;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 14;
        }
        if (match_StepLine(context, token))
        {
                startRule(context, RuleType.Step);
                build(context, token);
            return 15;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Other(context, token))
        {
                startRule(context, RuleType.Description);
                build(context, token);
            return 13;
        }
        
        final String stateComment = "State: 12 - Feature:2>Scenario_Definition:1>__alt0:0>Scenario:0>#ScenarioLine:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#Empty", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 12;

    }


    // Feature:2>Scenario_Definition:1>__alt0:0>Scenario:1>Scenario_Description:0>Description_Helper:1>Description:0>#Other:0
    private int matchTokenAt_13(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                build(context, token);
            return 28;
        }
        if (match_Comment(context, token))
        {
                endRule(context, RuleType.Description);
                build(context, token);
            return 14;
        }
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.Description);
                startRule(context, RuleType.Step);
                build(context, token);
            return 15;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Description);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Other(context, token))
        {
                build(context, token);
            return 13;
        }
        
        final String stateComment = "State: 13 - Feature:2>Scenario_Definition:1>__alt0:0>Scenario:1>Scenario_Description:0>Description_Helper:1>Description:0>#Other:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 13;

    }


    // Feature:2>Scenario_Definition:1>__alt0:0>Scenario:1>Scenario_Description:0>Description_Helper:2>#Comment:0
    private int matchTokenAt_14(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                build(context, token);
            return 28;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 14;
        }
        if (match_StepLine(context, token))
        {
                startRule(context, RuleType.Step);
                build(context, token);
            return 15;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 14;
        }
        
        final String stateComment = "State: 14 - Feature:2>Scenario_Definition:1>__alt0:0>Scenario:1>Scenario_Description:0>Description_Helper:2>#Comment:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 14;

    }


    // Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:0>#StepLine:0
    private int matchTokenAt_15(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                build(context, token);
            return 28;
        }
        if (match_TableRow(context, token))
        {
                startRule(context, RuleType.DataTable);
                build(context, token);
            return 16;
        }
        if (match_DocStringSeparator(context, token))
        {
                startRule(context, RuleType.DocString);
                build(context, token);
            return 31;
        }
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Step);
                build(context, token);
            return 15;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 15;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 15;
        }
        
        final String stateComment = "State: 15 - Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:0>#StepLine:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 15;

    }


    // Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0
    private int matchTokenAt_16(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                build(context, token);
            return 28;
        }
        if (match_TableRow(context, token))
        {
                build(context, token);
            return 16;
        }
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Step);
                build(context, token);
            return 15;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 16;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 16;
        }
        
        final String stateComment = "State: 16 - Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#TableRow", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 16;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:0>#ScenarioOutlineLine:0
    private int matchTokenAt_17(Token token, ParserContext context) {
        if (match_Empty(context, token))
        {
                build(context, token);
            return 17;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 19;
        }
        if (match_StepLine(context, token))
        {
                startRule(context, RuleType.Step);
                build(context, token);
            return 20;
        }
        if (match_TagLine(context, token))
        {
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 22;
        }
        if (match_ExamplesLine(context, token))
        {
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Examples);
                build(context, token);
            return 23;
        }
        if (match_Other(context, token))
        {
                startRule(context, RuleType.Description);
                build(context, token);
            return 18;
        }
        
        final String stateComment = "State: 17 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:0>#ScenarioOutlineLine:0";
        token.detach();
        List expectedTokens = asList("#Empty", "#Comment", "#StepLine", "#TagLine", "#ExamplesLine", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 17;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:1>ScenarioOutline_Description:0>Description_Helper:1>Description:0>#Other:0
    private int matchTokenAt_18(Token token, ParserContext context) {
        if (match_Comment(context, token))
        {
                endRule(context, RuleType.Description);
                build(context, token);
            return 19;
        }
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.Description);
                startRule(context, RuleType.Step);
                build(context, token);
            return 20;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Description);
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 22;
        }
        if (match_ExamplesLine(context, token))
        {
                endRule(context, RuleType.Description);
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Examples);
                build(context, token);
            return 23;
        }
        if (match_Other(context, token))
        {
                build(context, token);
            return 18;
        }
        
        final String stateComment = "State: 18 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:1>ScenarioOutline_Description:0>Description_Helper:1>Description:0>#Other:0";
        token.detach();
        List expectedTokens = asList("#Comment", "#StepLine", "#TagLine", "#ExamplesLine", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 18;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:1>ScenarioOutline_Description:0>Description_Helper:2>#Comment:0
    private int matchTokenAt_19(Token token, ParserContext context) {
        if (match_Comment(context, token))
        {
                build(context, token);
            return 19;
        }
        if (match_StepLine(context, token))
        {
                startRule(context, RuleType.Step);
                build(context, token);
            return 20;
        }
        if (match_TagLine(context, token))
        {
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 22;
        }
        if (match_ExamplesLine(context, token))
        {
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Examples);
                build(context, token);
            return 23;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 19;
        }
        
        final String stateComment = "State: 19 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:1>ScenarioOutline_Description:0>Description_Helper:2>#Comment:0";
        token.detach();
        List expectedTokens = asList("#Comment", "#StepLine", "#TagLine", "#ExamplesLine", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 19;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:0>#StepLine:0
    private int matchTokenAt_20(Token token, ParserContext context) {
        if (match_TableRow(context, token))
        {
                startRule(context, RuleType.DataTable);
                build(context, token);
            return 21;
        }
        if (match_DocStringSeparator(context, token))
        {
                startRule(context, RuleType.DocString);
                build(context, token);
            return 29;
        }
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Step);
                build(context, token);
            return 20;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 22;
        }
        if (match_ExamplesLine(context, token))
        {
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Examples);
                build(context, token);
            return 23;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 20;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 20;
        }
        
        final String stateComment = "State: 20 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:0>#StepLine:0";
        token.detach();
        List expectedTokens = asList("#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ExamplesLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 20;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0
    private int matchTokenAt_21(Token token, ParserContext context) {
        if (match_TableRow(context, token))
        {
                build(context, token);
            return 21;
        }
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Step);
                build(context, token);
            return 20;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 22;
        }
        if (match_ExamplesLine(context, token))
        {
                endRule(context, RuleType.DataTable);
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Examples);
                build(context, token);
            return 23;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 21;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 21;
        }
        
        final String stateComment = "State: 21 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0";
        token.detach();
        List expectedTokens = asList("#TableRow", "#StepLine", "#TagLine", "#ExamplesLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 21;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:0>Tags:0>#TagLine:0
    private int matchTokenAt_22(Token token, ParserContext context) {
        if (match_TagLine(context, token))
        {
                build(context, token);
            return 22;
        }
        if (match_ExamplesLine(context, token))
        {
                endRule(context, RuleType.Tags);
                startRule(context, RuleType.Examples);
                build(context, token);
            return 23;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 22;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 22;
        }
        
        final String stateComment = "State: 22 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:0>Tags:0>#TagLine:0";
        token.detach();
        List expectedTokens = asList("#TagLine", "#ExamplesLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 22;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:0>#ExamplesLine:0
    private int matchTokenAt_23(Token token, ParserContext context) {
        if (match_Empty(context, token))
        {
                build(context, token);
            return 23;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 25;
        }
        if (match_TableRow(context, token))
        {
                build(context, token);
            return 26;
        }
        if (match_Other(context, token))
        {
                startRule(context, RuleType.Description);
                build(context, token);
            return 24;
        }
        
        final String stateComment = "State: 23 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:0>#ExamplesLine:0";
        token.detach();
        List expectedTokens = asList("#Empty", "#Comment", "#TableRow", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 23;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:1>Examples_Description:0>Description_Helper:1>Description:0>#Other:0
    private int matchTokenAt_24(Token token, ParserContext context) {
        if (match_Comment(context, token))
        {
                endRule(context, RuleType.Description);
                build(context, token);
            return 25;
        }
        if (match_TableRow(context, token))
        {
                endRule(context, RuleType.Description);
                build(context, token);
            return 26;
        }
        if (match_Other(context, token))
        {
                build(context, token);
            return 24;
        }
        
        final String stateComment = "State: 24 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:1>Examples_Description:0>Description_Helper:1>Description:0>#Other:0";
        token.detach();
        List expectedTokens = asList("#Comment", "#TableRow", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 24;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:1>Examples_Description:0>Description_Helper:2>#Comment:0
    private int matchTokenAt_25(Token token, ParserContext context) {
        if (match_Comment(context, token))
        {
                build(context, token);
            return 25;
        }
        if (match_TableRow(context, token))
        {
                build(context, token);
            return 26;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 25;
        }
        
        final String stateComment = "State: 25 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:1>Examples_Description:0>Description_Helper:2>#Comment:0";
        token.detach();
        List expectedTokens = asList("#Comment", "#TableRow", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 25;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:2>#TableRow:0
    private int matchTokenAt_26(Token token, ParserContext context) {
        if (match_TableRow(context, token))
        {
                build(context, token);
            return 27;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 26;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 26;
        }
        
        final String stateComment = "State: 26 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:2>#TableRow:0";
        token.detach();
        List expectedTokens = asList("#TableRow", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 26;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:3>#TableRow:0
    private int matchTokenAt_27(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.Examples);
                endRule(context, RuleType.Examples_Definition);
                endRule(context, RuleType.ScenarioOutline);
                endRule(context, RuleType.Scenario_Definition);
                build(context, token);
            return 28;
        }
        if (match_TableRow(context, token))
        {
                build(context, token);
            return 27;
        }
        if (match_TagLine(context, token))
        {
            if (lookahead_0(context, token))
            {
                endRule(context, RuleType.Examples);
                endRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 22;
            }
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.Examples);
                endRule(context, RuleType.Examples_Definition);
                endRule(context, RuleType.ScenarioOutline);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ExamplesLine(context, token))
        {
                endRule(context, RuleType.Examples);
                endRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Examples);
                build(context, token);
            return 23;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.Examples);
                endRule(context, RuleType.Examples_Definition);
                endRule(context, RuleType.ScenarioOutline);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.Examples);
                endRule(context, RuleType.Examples_Definition);
                endRule(context, RuleType.ScenarioOutline);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 27;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 27;
        }
        
        final String stateComment = "State: 27 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:3>#TableRow:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 27;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0
    private int matchTokenAt_29(Token token, ParserContext context) {
        if (match_DocStringSeparator(context, token))
        {
                build(context, token);
            return 30;
        }
        if (match_Other(context, token))
        {
                build(context, token);
            return 29;
        }
        
        final String stateComment = "State: 29 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0";
        token.detach();
        List expectedTokens = asList("#DocStringSeparator", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 29;

    }


    // Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0
    private int matchTokenAt_30(Token token, ParserContext context) {
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Step);
                build(context, token);
            return 20;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 22;
        }
        if (match_ExamplesLine(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Examples_Definition);
                startRule(context, RuleType.Examples);
                build(context, token);
            return 23;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 30;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 30;
        }
        
        final String stateComment = "State: 30 - Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0";
        token.detach();
        List expectedTokens = asList("#StepLine", "#TagLine", "#ExamplesLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 30;

    }


    // Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0
    private int matchTokenAt_31(Token token, ParserContext context) {
        if (match_DocStringSeparator(context, token))
        {
                build(context, token);
            return 32;
        }
        if (match_Other(context, token))
        {
                build(context, token);
            return 31;
        }
        
        final String stateComment = "State: 31 - Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0";
        token.detach();
        List expectedTokens = asList("#DocStringSeparator", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 31;

    }


    // Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0
    private int matchTokenAt_32(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                build(context, token);
            return 28;
        }
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Step);
                build(context, token);
            return 15;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Scenario);
                endRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 32;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 32;
        }
        
        final String stateComment = "State: 32 - Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 32;

    }


    // Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0
    private int matchTokenAt_33(Token token, ParserContext context) {
        if (match_DocStringSeparator(context, token))
        {
                build(context, token);
            return 34;
        }
        if (match_Other(context, token))
        {
                build(context, token);
            return 33;
        }
        
        final String stateComment = "State: 33 - Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0";
        token.detach();
        List expectedTokens = asList("#DocStringSeparator", "#Other");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 33;

    }


    // Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0
    private int matchTokenAt_34(Token token, ParserContext context) {
        if (match_EOF(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                build(context, token);
            return 28;
        }
        if (match_StepLine(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                startRule(context, RuleType.Step);
                build(context, token);
            return 9;
        }
        if (match_TagLine(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Tags);
                build(context, token);
            return 11;
        }
        if (match_ScenarioLine(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.Scenario);
                build(context, token);
            return 12;
        }
        if (match_ScenarioOutlineLine(context, token))
        {
                endRule(context, RuleType.DocString);
                endRule(context, RuleType.Step);
                endRule(context, RuleType.Background);
                startRule(context, RuleType.Scenario_Definition);
                startRule(context, RuleType.ScenarioOutline);
                build(context, token);
            return 17;
        }
        if (match_Comment(context, token))
        {
                build(context, token);
            return 34;
        }
        if (match_Empty(context, token))
        {
                build(context, token);
            return 34;
        }
        
        final String stateComment = "State: 34 - Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0";
        token.detach();
        List expectedTokens = asList("#EOF", "#StepLine", "#TagLine", "#ScenarioLine", "#ScenarioOutlineLine", "#Comment", "#Empty");
        ParserException error = token.isEOF()
                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)
                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);
        if (stopAtFirstError)
            throw error;

        addError(context, error);
        return 34;

    }



    private boolean lookahead_0(ParserContext context, Token currentToken) {
        currentToken.detach();
        Token token;
        Queue queue = new ArrayDeque();
        boolean match = false;
        do
        {
            token = readToken(context);
            token.detach();
            queue.add(token);

            if (false
                || match_ExamplesLine(context, token)
            )
            {
                match = true;
                break;
            }
        } while (false
            || match_Empty(context, token)
            || match_Comment(context, token)
            || match_TagLine(context, token)
        );

        context.tokenQueue.addAll(queue);

        return match;
    }


    public interface Builder {
        void build(Token token);
        void startRule(RuleType ruleType);
        void endRule(RuleType ruleType);
        T getResult();
        void reset();
    }

    public interface ITokenScanner {
        Token read();
    }

    public interface ITokenMatcher {
        boolean match_EOF(Token token);
        boolean match_Empty(Token token);
        boolean match_Comment(Token token);
        boolean match_TagLine(Token token);
        boolean match_FeatureLine(Token token);
        boolean match_BackgroundLine(Token token);
        boolean match_ScenarioLine(Token token);
        boolean match_ScenarioOutlineLine(Token token);
        boolean match_ExamplesLine(Token token);
        boolean match_StepLine(Token token);
        boolean match_DocStringSeparator(Token token);
        boolean match_TableRow(Token token);
        boolean match_Language(Token token);
        boolean match_Other(Token token);
        void reset();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy