我正在寻找正确的正则表达式表单,以便在遇到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
但这不起作用,所以我很感激指点。
非常感谢
答案 0 :(得分:1)
我成功使用了以下方法:
val keyword = regex ("int[^a-zA-Z]".r)
val identifier = not (keyword) ~> "[a-zA-Z]+".r
换句话说,只有在关键字后面没有可以将其扩展为标识符的字符时才识别该关键字。缺点是扩展正则表达式在关键字定义和标识符1中都重复出现,但如果需要,可以将其考虑在内。
你必须要小心如何使用关键字解析器,因为它也会捕获关键字之后的字符。它在not
的上下文中是安全的,因为不会消耗任何输入。
请注意,通常不需要显式处理空格,因为literal
和regex
解析器组合器会在开始解析您真正想要的内容之前处理它。
通过编写一个方法来从关键字字符串列表和扩展正则表达式构建关键字解析器,这种方法很容易推广到多个标识符。
BTW,Kiama并没有真正提供解析组合器。我们依赖于Scala库中的那些。我们做为特殊情况提供标准扩展,但基本行为只是直接来自库。因此,我不清楚你的问题实际上与Kiama有关。正如上面的评论中所提到的,包括一个自包含的问题示例将有助于我们更准确地了解您正在使用的库。