【问题标题】:Resolving left-recursion in my grammar在我的语法中解决左递归
【发布时间】:2016-04-18 12:36:11
【问题描述】:

我的语法在第六个产生式规则中有左递归的情况。

我通过像这样替换规则 6 和 7 解决了这个问题:

我在这个语法中找不到任何间接左递归。

唯一困扰我的是最终的生产规则,它有一个终端被两个非终端包围。

我的两个问题是:

  • 我解决的左递归是否正确?
  • 最终生产规则是左递归吗?我不确定如何 对待这种特殊情况。

【问题讨论】:

    标签: parsing recursion compiler-construction grammar left-recursion


    【解决方案1】:

    是的,您的分辨率是正确的。您可能希望删除 epsilon 规则以方便使用,但接受的字符串是正确的。

    X -> -
    X -> -Z
    Z -> +
    Z -> +Z
    Z -> X + Y
    ... and Y is of the form 0* 1 (no syntax collisions)
    

    作为检查,请注意您现在可以将这条最终规则替换为两条新规则,一条用于 X 的每个扩展:

    Z -> -  + Y
    Z -> -Z + Y
    

    这会从 Z 规则中完全删除 X,然后每个 Z 规则都将以终端开头。

    不,您的最终生产规则不再是左递归的。 X 现在必须解析为以非终结符开头的字符串。

    不过,我不得不承认,我很好奇这种语言的用途。 :-)

    【讨论】:

    • 感谢您的帮助澄清。该语法只是用于学习目的,以了解解决左递归的概念,因此没有实际应用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多