我想出了以下语法来强制执行优先级:
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中实现这一点的。我试图使用语法谓词来解决这个问题,但这并没有帮助。也许我没有正确使用它们?
我会继续努力,但我想得越多,就越困惑。有人能帮帮我吗?这是我遇到的一个概念问题,我认为这是关于如何正确设置没有回溯的语法。但如果我想正确地制作自己的自定义工具,我就必须这样做。