Как отфильтровать последовательность токенов, идущих от моего Lexer к моему парсеру при использовании комбинаторов парсера Scala?
Позвольте мне объяснить - предположим, у меня есть довольно стандартный шаблон Lexer (расширение StdLexical
) и Parser (расширение StdTokenParsers
). Лексер превращает последовательность символов в последовательность токенов, затем анализатор превращает последовательность токенов в абстрактное синтаксическое дерево (типа Expr
).
Я решаю, что для некоторых токенов, которые могут возникнуть в любом месте потока, я бы хотел иметь возможность отфильтровывать их, поэтому мне нужна функция, которая бы помещалась между Lexer и Parser для удаления этих токенов. Например, я бы хотел, чтобы лексер токенизировал комментарии, а затем отфильтровал их позже.
Как лучше написать этот фильтр? Это может использовать идиому синтаксического анализатора, но не обязательно.
Пример текущего кода:
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))