加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – JavaCC警告的解释和解决方案“正则表达式选择:FO

发布时间:2020-12-14 02:29:06 所属栏目:百科 来源:网络整理
导读:我正在教自己在业余爱好项目中使用 JavaCC,并且有一个简单的语法来编写解析器.解析器的一部分包括以下内容: TOKEN : { DIGIT : (["0"-"9"]) }TOKEN : { INTEGER : (DIGIT)+ }TOKEN : { INTEGER_PAIR : (INTEGER){2} }TOKEN : { FLOAT : (NEGATE)? INTEGER |
我正在教自己在业余爱好项目中使用 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.或者它可能是INTEGER 12345,另一个标记.存在的问题是因为您不需要INTEGER_PAIR(或FLOAT_PAIR)的词法元素之间的空格.

你几乎不应该尝试在词法分析器中处理这样的对.相反,您应该将普通数字(INTEGER和FLOAT)作为标记处理,并在解析器中处理诸如否定和配对之类的事情,其中??处理和剥离空白.

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

另外,请注意词法分析器中的单位数整数将不会与INTEGER匹配,它们将以DIGIT的形式出现.但是,我不知道JavaCC为您修复的正确语法.你想要的是将DIGIT定义为不是一个标记,而只是你可以在其他标记的定义中使用的东西;或者,直接在您的规则中使用DIGIT的地方嵌入DIGIT([0-9])的定义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读