我从jflex代码中获得了以下两条规则:
Bool = true
Ident = [:letter:][:letterdigit:]*例如,如果我试图分析"trueStat“一词,它就会被识别为一个Ident表达式,而不是Bool。我怎样才能避免Jflex中的这种模棱两可?
发布于 2022-05-09 03:39:02
在几乎所有的语言中,只有当关键字是一个完整的词时,它才会被识别为关键字。否则,您将最终禁止标识符,如format、downtime和endurance (它们将分别以关键字for、do和end开头)。对程序员来说,这是相当令人困惑的,尽管这并非闻所未闻。词汇扫描器生成器(如Flex和JFlex )通常试图简化常见情况;因此,您提供的代码片段将trueStat识别为一个标识符。但是,如果您确实希望将其识别为一个关键字,然后是一个标识符,您可以通过在所有关键字中添加尾随上下文来实现这一点:
Bool = true/[:letterdigit:]*
Ident = [:letter:][:letterdigit:]*使用这对模式,true将匹配Bool规则,即使它以trueStat的形式出现。该模式匹配true和紧跟在它后面的任何字母数字字符串,然后重绕输入游标,以便匹配的令牌仅为true。
注意,与Lex和Flex一样,JFlex在当前输入位置接受最长的匹配;如果多个规则接受此匹配,则执行与第一个这样的规则对应的操作。(有关匹配算法的稍长解释,请参见“输入如何匹配”一节。)就此规则而言,尾随上下文被视为匹配的一部分(但是,如上所述,将从匹配中删除)。
该规则的结果是,无论特定模式是否使用尾随上下文,都应该将更多特定的模式放在它们可能覆盖的一般模式之前。因此,Bool规则必须先于Ident规则。
https://stackoverflow.com/questions/72164661
复制相似问题