visitNonterminalSymbol<E> method

  1. @override
Parser visitNonterminalSymbol<E>(
  1. NonterminalSymbol<E> node
)
override

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;
    }
  }
}