Source: parser.js
// This file is generated. Do not edit! Edit gherkin-javascript.razor instead.
var Errors = require('./errors');
var AstBuilder = require('./ast_builder');
var TokenScanner = require('./token_scanner');
var TokenMatcher = require('./token_matcher');
var RULE_TYPES = [
'None',
'_EOF', // #EOF
'_Empty', // #Empty
'_Comment', // #Comment
'_TagLine', // #TagLine
'_ScenarioLine', // #ScenarioLine
'_ExamplesLine', // #ExamplesLine
'_StepLine', // #StepLine
'_DocStringSeparator', // #DocStringSeparator
'_TableRow', // #TableRow
'_Language', // #Language
'_Other', // #Other
'GherkinDocument', // GherkinDocument! := Scenario_Definition*
'Scenario_Definition', // Scenario_Definition! := Tags? Scenario
'Scenario', // Scenario! := #ScenarioLine Scenario_Description Scenario_Step*
'Scenario_Step', // Scenario_Step := Step
'Step', // Step! := #StepLine Step_Arg?
'Step_Arg', // Step_Arg := (DataTable | DocString)
'DataTable', // DataTable! := #TableRow+
'DocString', // DocString! := #DocStringSeparator #Other* #DocStringSeparator
'Tags', // Tags! := #TagLine+
'Scenario_Description', // Scenario_Description := Description_Helper
'Description_Helper', // Description_Helper := #Empty* Description? #Comment*
'Description', // Description! := #Other+
];
module.exports = function Parser(builder) {
builder = builder || new AstBuilder();
var self = this;
var context;
this.parse = function(tokenScanner, tokenMatcher) {
if(typeof tokenScanner == 'string') {
tokenScanner = new TokenScanner(tokenScanner);
}
tokenMatcher = tokenMatcher || new TokenMatcher();
builder.reset();
tokenMatcher.reset();
context = {
tokenScanner: tokenScanner,
tokenMatcher: tokenMatcher,
tokenQueue: [],
errors: []
};
startRule(context, "GherkinDocument");
var state = 0;
var token = null;
while(true) {
token = readToken(context);
state = matchToken(state, token, context);
if(token.isEof) break;
}
endRule(context, "GherkinDocument");
if(context.errors.length > 0) {
throw Errors.CompositeParserException.create(context.errors);
}
return getResult();
};
function addError(context, error) {
context.errors.push(error);
if (context.errors.length > 10)
throw Errors.CompositeParserException.create(context.errors);
}
function startRule(context, ruleType) {
handleAstError(context, function () {
builder.startRule(ruleType);
});
}
function endRule(context, ruleType) {
handleAstError(context, function () {
builder.endRule(ruleType);
});
}
function build(context, token) {
handleAstError(context, function () {
builder.build(token);
});
}
function getResult() {
return builder.getResult();
}
function handleAstError(context, action) {
handleExternalError(context, true, action)
}
function handleExternalError(context, defaultValue, action) {
if(self.stopAtFirstError) return action();
try {
return action();
} catch (e) {
if(e instanceof Errors.CompositeParserException) {
e.errors.forEach(function (error) {
addError(context, error);
});
} else if(
e instanceof Errors.ParserException ||
e instanceof Errors.AstBuilderException ||
e instanceof Errors.UnexpectedTokenException ||
e instanceof Errors.NoSuchLanguageException
) {
addError(context, e);
} else {
throw e;
}
}
return defaultValue;
}
function readToken(context) {
return context.tokenQueue.length > 0 ?
context.tokenQueue.shift() :
context.tokenScanner.read();
}
function matchToken(state, token, context) {
switch(state) {
case 0:
return matchTokenAt_0(token, context);
case 1:
return matchTokenAt_1(token, context);
case 2:
return matchTokenAt_2(token, context);
case 3:
return matchTokenAt_3(token, context);
case 4:
return matchTokenAt_4(token, context);
case 5:
return matchTokenAt_5(token, context);
case 6:
return matchTokenAt_6(token, context);
case 8:
return matchTokenAt_8(token, context);
case 9:
return matchTokenAt_9(token, context);
default:
throw new Error("Unknown state: " + state);
}
}
// Start
function matchTokenAt_0(token, context) {
if(match_EOF(context, token)) {
build(context, token);
return 7;
}
if(match_TagLine(context, token)) {
startRule(context, 'Scenario_Definition');
startRule(context, 'Tags');
build(context, token);
return 1;
}
if(match_ScenarioLine(context, token)) {
startRule(context, 'Scenario_Definition');
startRule(context, 'Scenario');
build(context, token);
return 2;
}
if(match_Comment(context, token)) {
build(context, token);
return 0;
}
if(match_Empty(context, token)) {
build(context, token);
return 0;
}
var stateComment = "State: 0 - Start";
token.detach();
var expectedTokens = ["#EOF", "#TagLine", "#ScenarioLine", "#Comment", "#Empty"];
var error = token.isEof ?
Errors.UnexpectedEOFException.create(token, expectedTokens, stateComment) :
Errors.UnexpectedTokenException.create(token, expectedTokens, stateComment);
if (self.stopAtFirstError) throw error;
addError(context, error);
return 0;
}
// GherkinDocument:0>Scenario_Definition:0>Tags:0>#TagLine:0
function matchTokenAt_1(token, context) {
if(match_TagLine(context, token)) {
build(context, token);
return 1;
}
if(match_ScenarioLine(context, token)) {
endRule(context, 'Tags');
startRule(context, 'Scenario');
build(context, token);
return 2;
}
if(match_Comment(context, token)) {
build(context, token);
return 1;
}
if(match_Empty(context, token)) {
build(context, token);
return 1;
}
var stateComment = "State: 1 - GherkinDocument:0>Scenario_Definition:0>Tags:0>#TagLine:0";
token.detach();
var expectedTokens = ["#TagLine", "#ScenarioLine", "#Comment", "#Empty"];
var error = token.isEof ?
Errors.UnexpectedEOFException.create(token, expectedTokens, stateComment) :
Errors.UnexpectedTokenException.create(token, expectedTokens, stateComment);
if (self.stopAtFirstError) throw error;
addError(context, error);
return 1;
}
// GherkinDocument:0>Scenario_Definition:1>Scenario:0>#ScenarioLine:0
function matchTokenAt_2(token, context) {
if(match_EOF(context, token)) {
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
build(context, token);
return 7;
}
if(match_Empty(context, token)) {
build(context, token);
return 2;
}
if(match_Comment(context, token)) {
build(context, token);
return 4;
}
if(match_StepLine(context, token)) {
startRule(context, 'Step');
build(context, token);
return 5;
}
if(match_TagLine(context, token)) {
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Tags');
build(context, token);
return 1;
}
if(match_ScenarioLine(context, token)) {
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Scenario');
build(context, token);
return 2;
}
if(match_Other(context, token)) {
startRule(context, 'Description');
build(context, token);
return 3;
}
var stateComment = "State: 2 - GherkinDocument:0>Scenario_Definition:1>Scenario:0>#ScenarioLine:0";
token.detach();
var expectedTokens = ["#EOF", "#Empty", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#Other"];
var error = token.isEof ?
Errors.UnexpectedEOFException.create(token, expectedTokens, stateComment) :
Errors.UnexpectedTokenException.create(token, expectedTokens, stateComment);
if (self.stopAtFirstError) throw error;
addError(context, error);
return 2;
}
// GherkinDocument:0>Scenario_Definition:1>Scenario:1>Scenario_Description:0>Description_Helper:1>Description:0>#Other:0
function matchTokenAt_3(token, context) {
if(match_EOF(context, token)) {
endRule(context, 'Description');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
build(context, token);
return 7;
}
if(match_Comment(context, token)) {
endRule(context, 'Description');
build(context, token);
return 4;
}
if(match_StepLine(context, token)) {
endRule(context, 'Description');
startRule(context, 'Step');
build(context, token);
return 5;
}
if(match_TagLine(context, token)) {
endRule(context, 'Description');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Tags');
build(context, token);
return 1;
}
if(match_ScenarioLine(context, token)) {
endRule(context, 'Description');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Scenario');
build(context, token);
return 2;
}
if(match_Other(context, token)) {
build(context, token);
return 3;
}
var stateComment = "State: 3 - GherkinDocument:0>Scenario_Definition:1>Scenario:1>Scenario_Description:0>Description_Helper:1>Description:0>#Other:0";
token.detach();
var expectedTokens = ["#EOF", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#Other"];
var error = token.isEof ?
Errors.UnexpectedEOFException.create(token, expectedTokens, stateComment) :
Errors.UnexpectedTokenException.create(token, expectedTokens, stateComment);
if (self.stopAtFirstError) throw error;
addError(context, error);
return 3;
}
// GherkinDocument:0>Scenario_Definition:1>Scenario:1>Scenario_Description:0>Description_Helper:2>#Comment:0
function matchTokenAt_4(token, context) {
if(match_EOF(context, token)) {
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
build(context, token);
return 7;
}
if(match_Comment(context, token)) {
build(context, token);
return 4;
}
if(match_StepLine(context, token)) {
startRule(context, 'Step');
build(context, token);
return 5;
}
if(match_TagLine(context, token)) {
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Tags');
build(context, token);
return 1;
}
if(match_ScenarioLine(context, token)) {
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Scenario');
build(context, token);
return 2;
}
if(match_Empty(context, token)) {
build(context, token);
return 4;
}
var stateComment = "State: 4 - GherkinDocument:0>Scenario_Definition:1>Scenario:1>Scenario_Description:0>Description_Helper:2>#Comment:0";
token.detach();
var expectedTokens = ["#EOF", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#Empty"];
var error = token.isEof ?
Errors.UnexpectedEOFException.create(token, expectedTokens, stateComment) :
Errors.UnexpectedTokenException.create(token, expectedTokens, stateComment);
if (self.stopAtFirstError) throw error;
addError(context, error);
return 4;
}
// GherkinDocument:0>Scenario_Definition:1>Scenario:2>Scenario_Step:0>Step:0>#StepLine:0
function matchTokenAt_5(token, context) {
if(match_EOF(context, token)) {
endRule(context, 'Step');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
build(context, token);
return 7;
}
if(match_TableRow(context, token)) {
startRule(context, 'DataTable');
build(context, token);
return 6;
}
if(match_DocStringSeparator(context, token)) {
startRule(context, 'DocString');
build(context, token);
return 8;
}
if(match_StepLine(context, token)) {
endRule(context, 'Step');
startRule(context, 'Step');
build(context, token);
return 5;
}
if(match_TagLine(context, token)) {
endRule(context, 'Step');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Tags');
build(context, token);
return 1;
}
if(match_ScenarioLine(context, token)) {
endRule(context, 'Step');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Scenario');
build(context, token);
return 2;
}
if(match_Comment(context, token)) {
build(context, token);
return 5;
}
if(match_Empty(context, token)) {
build(context, token);
return 5;
}
var stateComment = "State: 5 - GherkinDocument:0>Scenario_Definition:1>Scenario:2>Scenario_Step:0>Step:0>#StepLine:0";
token.detach();
var expectedTokens = ["#EOF", "#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ScenarioLine", "#Comment", "#Empty"];
var error = token.isEof ?
Errors.UnexpectedEOFException.create(token, expectedTokens, stateComment) :
Errors.UnexpectedTokenException.create(token, expectedTokens, stateComment);
if (self.stopAtFirstError) throw error;
addError(context, error);
return 5;
}
// GherkinDocument:0>Scenario_Definition:1>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt0:0>DataTable:0>#TableRow:0
function matchTokenAt_6(token, context) {
if(match_EOF(context, token)) {
endRule(context, 'DataTable');
endRule(context, 'Step');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
build(context, token);
return 7;
}
if(match_TableRow(context, token)) {
build(context, token);
return 6;
}
if(match_StepLine(context, token)) {
endRule(context, 'DataTable');
endRule(context, 'Step');
startRule(context, 'Step');
build(context, token);
return 5;
}
if(match_TagLine(context, token)) {
endRule(context, 'DataTable');
endRule(context, 'Step');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Tags');
build(context, token);
return 1;
}
if(match_ScenarioLine(context, token)) {
endRule(context, 'DataTable');
endRule(context, 'Step');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Scenario');
build(context, token);
return 2;
}
if(match_Comment(context, token)) {
build(context, token);
return 6;
}
if(match_Empty(context, token)) {
build(context, token);
return 6;
}
var stateComment = "State: 6 - GherkinDocument:0>Scenario_Definition:1>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt0:0>DataTable:0>#TableRow:0";
token.detach();
var expectedTokens = ["#EOF", "#TableRow", "#StepLine", "#TagLine", "#ScenarioLine", "#Comment", "#Empty"];
var error = token.isEof ?
Errors.UnexpectedEOFException.create(token, expectedTokens, stateComment) :
Errors.UnexpectedTokenException.create(token, expectedTokens, stateComment);
if (self.stopAtFirstError) throw error;
addError(context, error);
return 6;
}
// GherkinDocument:0>Scenario_Definition:1>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt0:1>DocString:0>#DocStringSeparator:0
function matchTokenAt_8(token, context) {
if(match_DocStringSeparator(context, token)) {
build(context, token);
return 9;
}
if(match_Other(context, token)) {
build(context, token);
return 8;
}
var stateComment = "State: 8 - GherkinDocument:0>Scenario_Definition:1>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt0:1>DocString:0>#DocStringSeparator:0";
token.detach();
var expectedTokens = ["#DocStringSeparator", "#Other"];
var error = token.isEof ?
Errors.UnexpectedEOFException.create(token, expectedTokens, stateComment) :
Errors.UnexpectedTokenException.create(token, expectedTokens, stateComment);
if (self.stopAtFirstError) throw error;
addError(context, error);
return 8;
}
// GherkinDocument:0>Scenario_Definition:1>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt0:1>DocString:2>#DocStringSeparator:0
function matchTokenAt_9(token, context) {
if(match_EOF(context, token)) {
endRule(context, 'DocString');
endRule(context, 'Step');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
build(context, token);
return 7;
}
if(match_StepLine(context, token)) {
endRule(context, 'DocString');
endRule(context, 'Step');
startRule(context, 'Step');
build(context, token);
return 5;
}
if(match_TagLine(context, token)) {
endRule(context, 'DocString');
endRule(context, 'Step');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Tags');
build(context, token);
return 1;
}
if(match_ScenarioLine(context, token)) {
endRule(context, 'DocString');
endRule(context, 'Step');
endRule(context, 'Scenario');
endRule(context, 'Scenario_Definition');
startRule(context, 'Scenario_Definition');
startRule(context, 'Scenario');
build(context, token);
return 2;
}
if(match_Comment(context, token)) {
build(context, token);
return 9;
}
if(match_Empty(context, token)) {
build(context, token);
return 9;
}
var stateComment = "State: 9 - GherkinDocument:0>Scenario_Definition:1>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt0:1>DocString:2>#DocStringSeparator:0";
token.detach();
var expectedTokens = ["#EOF", "#StepLine", "#TagLine", "#ScenarioLine", "#Comment", "#Empty"];
var error = token.isEof ?
Errors.UnexpectedEOFException.create(token, expectedTokens, stateComment) :
Errors.UnexpectedTokenException.create(token, expectedTokens, stateComment);
if (self.stopAtFirstError) throw error;
addError(context, error);
return 9;
}
function match_EOF(context, token) {
return handleExternalError(context, false, function () {
return context.tokenMatcher.match_EOF(token);
});
}
function match_Empty(context, token) {
if(token.isEof) return false;
return handleExternalError(context, false, function () {
return context.tokenMatcher.match_Empty(token);
});
}
function match_Comment(context, token) {
if(token.isEof) return false;
return handleExternalError(context, false, function () {
return context.tokenMatcher.match_Comment(token);
});
}
function match_TagLine(context, token) {
if(token.isEof) return false;
return handleExternalError(context, false, function () {
return context.tokenMatcher.match_TagLine(token);
});
}
function match_ScenarioLine(context, token) {
if(token.isEof) return false;
return handleExternalError(context, false, function () {
return context.tokenMatcher.match_ScenarioLine(token);
});
}
function match_ExamplesLine(context, token) {
if(token.isEof) return false;
return handleExternalError(context, false, function () {
return context.tokenMatcher.match_ExamplesLine(token);
});
}
function match_StepLine(context, token) {
if(token.isEof) return false;
return handleExternalError(context, false, function () {
return context.tokenMatcher.match_StepLine(token);
});
}
function match_DocStringSeparator(context, token) {
if(token.isEof) return false;
return handleExternalError(context, false, function () {
return context.tokenMatcher.match_DocStringSeparator(token);
});
}
function match_TableRow(context, token) {
if(token.isEof) return false;
return handleExternalError(context, false, function () {
return context.tokenMatcher.match_TableRow(token);
});
}
function match_Language(context, token) {
if(token.isEof) return false;
return handleExternalError(context, false, function () {
return context.tokenMatcher.match_Language(token);
});
}
function match_Other(context, token) {
if(token.isEof) return false;
return handleExternalError(context, false, function () {
return context.tokenMatcher.match_Other(token);
});
}
}