visitCharacterClass method

  1. @override
ExpressionGenerator visitCharacterClass(
  1. CharacterClassExpression node
)
inherited

Implementation

@override
ExpressionGenerator visitCharacterClass(CharacterClassExpression node) {
  final g = ExpressionGenerator(node);
  g.generate = (block) {
    g.allocateVariable();
    final recognizerGenerator = RecognizerGenerator(
        list: node.startCharacters, maxCount: 10, variable: Members.ch);
    final control = recognizerGenerator.generate();
    if (control == null) {
      final range = g.allocate();
      final ranges = <int>[];
      for (final group in node.ranges.groups) {
        ranges.add(group.start);
        ranges.add(group.end);
      }

      block.assignConst(range, literalList(ranges));
      final args = [ref(range)];
      final call = callExpression(Members.matchRanges, args);
      if (g.isVariableDeclared) {
        block.assign(g.variable!, call);
      } else {
        block.callAndTryAssignFinal(g.variable, call);
      }
    } else {
      g.declareVariable(block);
      block.assign(Members.ok, false$);
      block.if$(control, (block) {
        final args = [ref(Members.ch)];
        final call = callExpression(Members.nextChar, args);
        if (g.variable == null) {
          block.addStatement(call);
        } else {
          block.assign(g.variable!, call);
        }
      });
    }
  };

  return g;
}