我尝试过 fastparse、parboiled2 和 scala-combinators。他们在定义 LEXER 时都有这个问题:
LET_KEYWORD ::= "let"
IDENTIFIER ::= "[a-zA-Z]+".r
当我根据输入运行它们时,"leto"
它们会产生[LET_KEYWORD,IDENTIFIER(o)]
.
我希望其中一些库能给我这样的行为:
如果输入是,"let"
那么它通过选择第一个定义的规则来解决歧义,因为它更相关。如果输入是"leto"
那么没有歧义并且只产生IDENTIFIER(leto)
. 这就是在 ANTLR 中描述的行为