visitNonterminalSymbol<E> method
Implementation
@override
Parser visitNonterminalSymbol<E>(NonterminalSymbol<E> node) {
final expression = node.expression;
final rule = expression.rule!;
final name = rule.name;
NonterminalParser<E> getParser() {
final parser = DummyParser<E>();
if (options.predict) {
final terminals = node.startTerminals.map((e) => e.name).toList();
if (options.debug) {
return PredictiveNonterminalDebugParser<E>(parser, name, terminals,
source: '$node');
} else {
return PredictiveNonterminalParser<E>(parser, name, terminals,
source: '$node');
}
} else {
if (options.debug) {
return NonterminalDebugParser<E>(parser, name, source: '$node');
} else {
return NonterminalParser<E>(parser, name, source: '$node');
}
}
}
if (rules.containsKey(node)) {
return rules[node]!;
}
final parser = getParser();
rules[node] = parser;
final child = visitOrderedChoice(expression) as Parser<E>;
parser.parser = child;
if (options.debug) {
rules[node] = parser;
return parser;
} else {
if (child is OrderedChoiceParser) {
rules[node] = parser;
return parser;
} else {
rules[node] = child;
return child;
}
}
}