findMatcher static method

Expression? findMatcher(
  1. Expression expression,
  2. Set<Expression> processed
)

Implementation

static Expression? findMatcher(
    Expression expression, Set<Expression> processed) {
  if (!processed.add(expression)) {
    return null;
  }

  switch (expression.kind) {
    case ExpressionKind.anyCharacter:
    case ExpressionKind.characterClass:
    case ExpressionKind.literal:
      return expression;
    case ExpressionKind.andPredicate:
    case ExpressionKind.notPredicate:
      final predicate = expression as PrefixExpression;
      return findMatcher(predicate.expression, processed);
    case ExpressionKind.capture:
    case ExpressionKind.oneOrMore:
    case ExpressionKind.optional:
    case ExpressionKind.zeroOrMore:
      return null;
    case ExpressionKind.orderedChoice:
    case ExpressionKind.sequence:
      final multiple = expression as MultipleExpression;
      final expressions = multiple.expressions;
      if (expressions.length > 1) {
        return null;
      }

      final child = expressions.first;
      return findMatcher(child, processed);
    case ExpressionKind.nonterminal:
    case ExpressionKind.terminal:
    case ExpressionKind.subterminal:
      final symbol = expression as SymbolExpression;
      return findMatcher(symbol.expression!, processed);
  }
}