Как фильтровать последовательность токенов, исходящих от моего Lexer, до моего анализатора при использовании комбинаторов парсера Scala?Фильтрация токенов от компиляторов Scala Parser
Позвольте мне объяснить - предположим, что у меня довольно стандартный образец Lexer (расширение StdLexical
) и анализатор (расширение StdTokenParsers
). Лексер превращает последовательность символов в последовательность токенов, затем парсер превращает последовательность токенов в абстрактное синтаксическое дерево (типа Expr
).
Я решил, что некоторые токены, которые могут произойти в любом месте потока, я хотел бы иметь возможность фильтровать, поэтому мне нужна функция, которая бы соответствовала между Lexer и Parser, чтобы удалить эти токены. Например, мне может потребоваться, чтобы lexer tokenise комментировал, а затем отфильтровывал эти комментарии позже.
Каков наилучший способ записи этого фильтра? Это может использовать идиому комбинаторного анализатора, но это необязательно.
Пример кода ток:
val reader = new PagedSeqReader(PagedSeq.fromReader(reader))
val tokens = new MyParser.lexical.Scanner(reader)
val parse = MyParser.phrase(parser)(tokens)
Я хотел бы быть в состоянии написать что-то вроде этого:
val reader = new PagedSeqReader(PagedSeq.fromReader(reader))
val tokens = new MyParser.lexical.Scanner(reader)
val parse = MyParser.phrase(parser)(filter(tokens))
Я уже делаю это надлежащим образом. Я хочу написать фильтр, как описано в вопросе. Приложение не удаляет комментарии, это просто самый простой способ объяснить проблему. –
Я сам написал это, потом вернулся и понял, что вы отредактировали! Вы можете принять принятый ответ, интересно, как код настолько похож. Я использовал рекурсию, и вы использовали цикл while, но, кроме того, они почти одинаковы :-) –