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