visitOrderedChoice method

  1. @override
ExpressionGenerator visitOrderedChoice(
  1. OrderedChoiceExpression node
)
override

Implementation

@override
ExpressionGenerator visitOrderedChoice(OrderedChoiceExpression node) {
  final g = ExpressionGenerator(node);
  g.generate = (block) {
    g.declareVariable(block);
    final rule = node.rule!;
    final level = node.level;
    final expressions = node.expressions;
    void failure(CodeBlock block) {
      if (rule.kind == ProductionRuleKind.terminal &&
          level == 0 &&
          !node.isOptional) {
        final args = [literalString(rule.name)];
        final control = callExpression(Members.fail, args);
        block.if$(control, (block) {
          final terminalId = rule.terminalId;
          final setFlag = failures.generateSet(true, [terminalId]);
          block.addSourceCode(setFlag.join('\n'));
        });
      }
    }

    if (expressions.length > 1) {
      _generateOrderedChoiceMultiple(node, block, g, failure);
    } else {
      _generateOrderedChoiceSingle(node, block, g, failure);
    }
  };

  return g;
}