} TOKEN : { ){2}-6ren">
gpt4 book ai didi

regex - JavaCC警告 "Regular expression choice : FOO can never be matched as : BAR"的解释和解决方案?

转载 作者:行者123 更新时间:2023-12-01 17:54:28 25 4
gpt4 key购买 nike

我正在自学在一个业余爱好项目中使用 JavaCC,并有一个简单的语法来编写解析器。解析器的一部分包括以下内容:

TOKEN : { < DIGIT : (["0"-"9"]) > }
TOKEN : { < INTEGER : (<DIGIT>)+ > }
TOKEN : { < INTEGER_PAIR : (<INTEGER>){2} > }
TOKEN : { < FLOAT : (<NEGATE>)? <INTEGER> | (<NEGATE>)? <INTEGER> "." <INTEGER> | (<NEGATE>)? <INTEGER> "." | (<NEGATE>)? "." <INTEGER> > }
TOKEN : { < FLOAT_PAIR : (<FLOAT>){2} > }
TOKEN : { < NUMBER_PAIR : <FLOAT_PAIR> | <INTEGER_PAIR> > }
TOKEN : { < NEGATE : "-" > }

使用 JavaCC 编译时,我得到输出:

Warning: Regular Expression choice : FLOAT_PAIR can never be matched as : NUMBER_PAIR

Warning: Regular Expression choice : INTEGER_PAIR can never be matched as : NUMBER_PAIR

我确信这是一个简单的概念,但我不明白这个警告,因为我是解析器生成和正则表达式的新手。

这个警告是什么意思(用新手术语来说)?

最佳答案

我不懂JavaCC,但我是一名编译器工程师。

FLOAT_PAIR 规则不明确。考虑以下文本:

0.0

这可以是 FLOAT 0 后跟 FLOAT .0;或者可以是 FLOAT 0. 后跟 FLOAT 0;两者都会产生 FLOAT_PAIR。或者它可以是单个 FLOAT 0.0

但更重要的是,您正在以一种永远不可能起作用的方式使用词法分析和组合。考虑这个数字:

12345

这可以被解析为INTEGER 12, INTEGER 345,从而产生INTEGER_PAIR。或者它可以被解析为INTEGER 123、INTEGER 45、另一个INTEGER_PAIR。或者它可能是另一个 token INTEGER 12345。之所以存在此问题,是因为您不需要 INTEGER_PAIR(或 FLOAT_PAIR)的词汇元素之间存在空格。

您几乎不应该尝试在词法分析器中处理这样的对。相反,您应该将纯数字(INTEGERFLOAT)作为标记来处理,并在解析器中处理诸如否定和配对之类的事情,其中​​空格已被处理和剥离。

(例如,你要如何处理“----42”?这是大多数编程语言中的有效表达式,它会正确计算多个否定,但不会被处理由你的词法分析器。)

此外,请注意词法分析器中的个位数整数不会匹配为 INTEGER,它们将显示为 DIGIT。不过,我不知道 JavaCC 的正确语法可以为您解决这个问题。您想要的是将 DIGIT 定义为不作为标记,而只是可以在其他标记的定义中使用的东西;或者,无论您在规则中使用 DIGIT 的位置,直接嵌入 DIGIT ([0-9]) 的定义。

关于regex - JavaCC警告 "Regular expression choice : FOO can never be matched as : BAR"的解释和解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/791591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com