我正在寻找正确的正则表达式形式给我的Kiama Packrat,以便当它遇到像int这样的关键字时,它会识别这是一个类型,而不是一个有效的变量名称。
目前,我有:
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但是这不起作用,所以我希望在这方面有一些建议。
非常感谢
发布于 2012-08-14 13:33:33
我已经成功地使用了以下方法:
val keyword = regex ("int[^a-zA-Z]".r)
val identifier = not (keyword) ~> "[a-zA-Z]+".r换句话说,只有当关键字后面没有可以将其扩展为标识符的字符时,才能识别该关键字。缺点是扩展regexp在关键字定义和标识符one中都是重复的,但如果您愿意,可以将其分解出来。
您必须小心使用关键字解析器,因为它也会捕获关键字后面的字符。它在not的上下文中是安全的,因为没有使用任何输入。
注意,空格通常不需要显式处理,因为literal和regex解析器组合子在开始解析您真正想要的内容之前会处理空格。
通过编写一个方法来从关键字字符串列表和扩展正则表达式构建关键字解析器,这种方法很容易推广到多个标识符。
顺便说一句,Kiama并没有真正提供解析组合子。我们依赖于Scala库中的那些。我们确实为特殊情况提供了一些标准扩展,但基本行为只是直接从库中获得的。因此,我不清楚你的问题是否真的与Kiama有关。正如在上面的评论中提到的,包含一个自包含的问题示例将有助于我们更清楚地了解您使用的是哪个库。
https://stackoverflow.com/questions/11881133
复制相似问题