Parsing 如何在Scala解析器组合器中组合Regexp和关键字

Parsing 如何在Scala解析器组合器中组合Regexp和关键字,parsing,scala,keyword,lexical-analysis,lexical,Parsing,Scala,Keyword,Lexical Analysis,Lexical,我见过两种在Scala中构建解析器的方法 第一个是从regexparser扩展并定义您的词汇模式。我看到的问题是,我真的不明白它是如何处理关键字歧义的。例如,如果我的关键字与ident匹配相同的模式,那么它将关键字处理为ident 为了反驳这一点,我看到过类似的文章展示了如何使用StandardTokenParser来指定关键字。但是,我不明白如何指定regexp模式!是的,StandardTokenParser附带了“ident”,但它没有附带我需要的其他语法(复杂的浮点数表示、特定的字符串文

我见过两种在Scala中构建解析器的方法

第一个是从regexparser扩展并定义您的词汇模式。我看到的问题是,我真的不明白它是如何处理关键字歧义的。例如,如果我的关键字与ident匹配相同的模式,那么它将关键字处理为ident

为了反驳这一点,我看到过类似的文章展示了如何使用StandardTokenParser来指定关键字。但是,我不明白如何指定regexp模式!是的,StandardTokenParser附带了“ident”,但它没有附带我需要的其他语法(复杂的浮点数表示、特定的字符串文字模式和转义规则等)


如何获得指定关键字和使用正则表达式指定令牌模式的能力?

我只编写了
RegexParsers
派生的解析器,但我所做的是这样的:

val name: Parser[String] = "[A-Z_a-z][A-Z_a-z0-9]*".r

val kwIf: Parser[String]    = "if\\b".r
val kwFor: Parser[String]   = "for\\b".r
val kwWhile: Parser[String] = "while\\b".r

val reserved: Parser[String] = ( kwIf | kwFor | kwWhile )

val identifier: Parser[String] = not(reserved) ~> name

我以前见过这个建议并尝试过,但遇到了一些问题,它似乎在使用not(…)限定的令牌。但是,我又试了一次,它确实有效。谢谢regexp中“\b”的意义是什么?你肯定没有在你的输入语言中对退格进行编码?!?更正。我的意思是指定一个单词边界。否则,您将匹配显示为合法标识符前缀的(伪)关键字。好的,这是另一个更新…根据我的测试,“保留”的定义甚至没有必要!似乎仅仅为关键字(例如kwIf)定义解析器就可以(可能在隐式def中)更改标记化?!?奇怪,但我已经非常明确地证实了这一点。有人能解释一下吗?你得说得更清楚些。也许用代码开始一个新的问题,说明你所看到的现象。或者编辑这个,如果你认为这更有意义的话。但请记住,组合分析器中的所有内容都是自上而下的。无论是在词法/常规级别还是在CFG产品级别,都没有从规范构建的状态机。