2011-04-22 60 views
1

我有此规则在ANTLR:ANTLR的:相互左递归规则

anREs : anRE 
     | ('(' anREs ')') => '(' anREs ')' 
     | (anREs '|' anREs) => anREs '|' anREs ; 

其中ANRE是正则表达式,当我要编译的规则文件我有此错误消息由于在第三替代最后一个规则:

错误(210):的 规则下列集是相互左递归 [anREs]

我怎么可以重新写这个规则?

感谢

+0

@巴特煮布锅感谢您的帮助,你是对的,我可以通过删除这一替代解决这个问题,但我需要它,我不能使用PCRE,因为我需要在我的规则中实现特殊功能。 – Radi 2011-04-22 18:58:43

回答

2

这里是你的左递归:

... | (anREs '|' anREs) => anREs '|' anREs ; 

更糟的是,它的暧昧。如果你有一个REs_1 | anREs_2 | anREs3作为输入, 目前尚不清楚子项的哪些子项|运营商是。

我预计这个解决问题,化解歧义,太:

... | (anRE '|' anREs) => anRE '|' anREs ; 
+0

好的,但是这个规则不能匹配这个输入:(anRE)| anRES – Radi 2011-04-23 09:26:29

+0

为什么不能?你有'('anREs')'和一个RE派生到一个RE。你真的尝试过吗? – 2011-04-23 09:44:16