ANTLR4自我和相互左递归

问题描述

在ANTLR4中是否可以通过简单的转换或替代方法来实现此目的?

a : a p
  | b q
  | c
  ;

b : b r
  | a s
  | d
  ;

也就是说,ab是自左递归和互左递归,其他规则(cd,{{1} },pqr)只是简单规则的占位符。

解决方法

首先,从两个规则中删除直接左递归。让我们考虑规则a

a
    : (b q | c) p+
    | b q
    | c
    ;

简化:

a
    : (b q | c) p*
    ;

对规则b进行类似的转换:

b
    : (a s | d) r*
    ;

现在可以用规则b的主体替换规则a中的b标识符:

a
    : (c | (a s | d) r* q) p*
    ;

或将规则a中的b标识符替换为规则a的正文:

b
    : ((b q | c) p* s | d) r*
    ;

如果需要,还可以摆脱直接的左递归。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...