繁体   English   中英

Jflex歧义

[英]Jflex ambiguity

我有来自 jflex 代码的这两条规则:

Bool = true
Ident = [:letter:][:letterdigit:]*

例如,如果我尝试分析单词“ trueStat ”,它会被识别为 Ident 表达式而不是 Bool。 我怎样才能在 Jflex 中避免这种类型的歧义?

在几乎所有语言中,只有当关键字是一个完整的词时,它才会被识别为关键字。 否则,您将最终禁止诸如formatdowntimeendurance之类的标识符(它们将分别以关键字fordoend开头)。 这对程序员来说是相当混乱的,尽管这并非闻所未闻。 词法扫描器生成器,如 Flex 和 JFlex,通常试图使常见情况变得简单; 因此,您提供的片段将trueStat识别为标识符。 但是如果你真的想将它识别为一个关键字后跟一个标识符,你可以通过为所有关键字添加尾随上下文来实现:

Bool = true/[:letterdigit:]*
Ident = [:letter:][:letterdigit:]*

对于那对模式, true将匹配Bool规则,即使它以trueStat的形式出现。 该模式匹配true和紧随其后的任何字母数字字符串,然后倒回输入 cursor 以便匹配的标记正好为true

请注意,与 Lex 和 Flex 一样,JFlex 接受当前输入 position 处的最长匹配; 如果有多个规则接受此匹配项,则执行与第一个此类规则对应的操作。 (有关匹配算法的稍微更长的解释,请参阅手册“如何匹配输入”部分。)出于此规则的目的,尾随上下文被视为匹配的一部分(但是,如上所述,然后从匹配中删除).

此规则的结果是您应该始终将更具体的模式放在它们可能覆盖的一般模式之前,无论特定模式是否使用尾随上下文。 所以Bool规则必须在Ident规则之前。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM