0

我正在寻找正确的正则表达式形式来提供给我的 Kiama Packrat 解析器,以便当它遇到像int它这样的关键字时,它会识别这是一种类型,而不是有效的 var 名称。

目前我有:

    lazy val type_int_ =  ".*\\bint\\b.*".r ^^ (s => TypeInt)


lazy val var_ =
    idn ^^ TermVar 


  lazy val idn =
    "[a-zA-Z][a-zA-Z0-9]*".r

但这不起作用,所以我会很感激这方面的指示。

非常感谢

4

1 回答 1

1

我已成功使用以下方法:

val keyword = regex ("int[^a-zA-Z]".r)

val identifier = not (keyword) ~> "[a-zA-Z]+".r

换句话说,仅当关键字后面没有可以将其扩展为标识符的字符时才识别该关键字。一个缺点是扩展正则表达式在关键字定义和标识符之一中重复,但如果您愿意,可以将其分解。

你必须小心如何使用关键字解析器,因为它也会捕获关键字之后的字符。它在 a 的上下文中是安全的not,因为不消耗任何输入。

请注意,通常不需要显式处理空格,因为literalregex解析器组合器在开始解析您真正想要的内容之前会处理它。

通过编写一个从关键字字符串列表和扩展正则表达式构建关键字解析器的方法,这种方法很容易推广到多个标识符。

顺便说一句,Kiama 并没有真正提供解析组合器。我们依赖 Scala 库中的那些。我们确实为特殊情况提供了一些标准扩展,但基本行为直接来自库。因此,我不清楚您的问题实际上是否与 Kiama 有关。正如上面评论中提到的,包括一个独立的问题示例将帮助我们更清楚地了解您正在使用哪个库。

于 2012-08-14T05:33:33.307 回答