首页
学习
活动
专区
圈层
工具
发布

Jflex歧义
EN

Stack Overflow用户
提问于 2022-05-08 19:58:20
回答 1查看 40关注 0票数 0

我从jflex代码中获得了以下两条规则:

代码语言:javascript
复制
Bool = true
Ident = [:letter:][:letterdigit:]*

例如,如果我试图分析"trueStat“一词,它就会被识别为一个Ident表达式,而不是Bool。我怎样才能避免Jflex中的这种模棱两可?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-09 03:39:02

在几乎所有的语言中,只有当关键字是一个完整的词时,它才会被识别为关键字。否则,您将最终禁止标识符,如formatdowntimeendurance (它们将分别以关键字fordoend开头)。对程序员来说,这是相当令人困惑的,尽管这并非闻所未闻。词汇扫描器生成器(如Flex和JFlex )通常试图简化常见情况;因此,您提供的代码片段将trueStat识别为一个标识符。但是,如果您确实希望将其识别为一个关键字,然后是一个标识符,您可以通过在所有关键字中添加尾随上下文来实现这一点:

代码语言:javascript
复制
Bool = true/[:letterdigit:]*
Ident = [:letter:][:letterdigit:]*

使用这对模式,true将匹配Bool规则,即使它以trueStat的形式出现。该模式匹配true和紧跟在它后面的任何字母数字字符串,然后重绕输入游标,以便匹配的令牌仅为true

注意,与Lex和Flex一样,JFlex在当前输入位置接受最长的匹配;如果多个规则接受此匹配,则执行与第一个这样的规则对应的操作。(有关匹配算法的稍长解释,请参见“输入如何匹配”一节。)就此规则而言,尾随上下文被视为匹配的一部分(但是,如上所述,将从匹配中删除)。

该规则的结果是,无论特定模式是否使用尾随上下文,都应该将更多特定的模式放在它们可能覆盖的一般模式之前。因此,Bool规则必须先于Ident规则。

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

https://stackoverflow.com/questions/72164661

复制
相关文章

相似问题

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