首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala中使用Kiama解析器匹配精确单词的正则表达式

在Scala中使用Kiama解析器匹配精确单词的正则表达式
EN

Stack Overflow用户
提问于 2012-08-09 18:13:25
回答 1查看 388关注 0票数 0

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

目前,我有:

代码语言:javascript
复制
    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

但是这不起作用,所以我希望在这方面有一些建议。

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-14 13:33:33

我已经成功地使用了以下方法:

代码语言:javascript
复制
val keyword = regex ("int[^a-zA-Z]".r)

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

换句话说,只有当关键字后面没有可以将其扩展为标识符的字符时,才能识别该关键字。缺点是扩展regexp在关键字定义和标识符one中都是重复的,但如果您愿意,可以将其分解出来。

您必须小心使用关键字解析器,因为它也会捕获关键字后面的字符。它在not的上下文中是安全的,因为没有使用任何输入。

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11881133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档