我怎样才能修复我写的语法?

时间:2013-09-21 16:24:00

标签: parsing antlr grammar antlr3 left-recursion

我提出了以下强制执行优先权的语法:

A :   L ( '[' A ']' L* )*
L :   M (('+'|'-')M)*
M :   P (('*'|'/')P)*
P :   ID | NUM

其中ID可以是字母,num是整数。

问题

我可以解析以下字符串:

a[i + 1]

我无法解析以下字符串:

a[i] + 1 or a[a[i]*i]

我的问题是A引入了递归问题。因为我不想做回溯。我必须通过重写语法来解决这个问题。我一直在看这个link。但是,我尝试修复也不起作用。有人可以帮忙吗?

尝试解决方案:

A : L ( '[' A ']')* | L*`  and let `Z = ( '[' A ']')*

但是,我认为这会改变我的语法定义,仍然是递归的,不允许我为a[i] + 1 or a[a[i]*i]

解决

其他信息:

我实际上是在antlr中实现这一点。我试图使用合成谓词来解决这个问题,但这并没有帮助。也许我没有正确使用它们?

我将继续破解这个问题,但我想的越多,我就越困惑。有人可以帮帮我吗?这是一个概念性的问题,我想如何正确设置没有回溯的语法。但如果我想要正确地制作自己的自定义工具,我将不得不这样做。

1 个答案:

答案 0 :(得分:1)

当您将索引移至ID之后而非L制作之后,您不会遇到问题:

A :   L
L :   M ( ('+'|'-') M )*
M :   P ( ('*'|'/') P )*
P :   ID I | NUM
I :   ( '[' A ']' )*

将解析您提供的所有3个输入示例:

  1. a[i + 1]
  2. a[i] + 1
  3. a[a[i]*i]