[英]How to remove left-recursion in the following grammar?
不幸的是,当规则传递了参数时, ANTLR不可能支持直接左递归。 唯一可行的选择是删除左递归 。 有没有办法删除以下语法中的左递归?
a[int x]
: b a[$x] c
| a[$x - 1]
(
c a[$x - 1]
| b c
)
;
问题出在第二种选择中,涉及左递归。 任何帮助将不胜感激。
如果没有参数且格式更简单,它将看起来像这样:
a
: b a c
| a (c a | b c)
;
当a
的左递归替代项匹配n次时,这仅意味着(ca | bc)
将被匹配n次,并在终止bac
之前加上bac
(第一个替代项)。 这意味着该规则将始终以bac
开头,然后出现零个或多个(ca | bc)
:
a
: b a c (c a | b c)*
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.