代码之家  ›  专栏  ›  技术社区  ›  GeekyOmega

我该如何修改我写的语法?

  •  0
  • GeekyOmega  · 技术社区  · 11 年前

    我想出了以下语法来强制执行优先级:

    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 回复  |  直到 11 年前
        1
  •  1
  •   Bart Kiers    11 年前

    当你将指数移动到 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]