【问题标题】:Shift reduce and reduce reduce conflicts转移减少和减少减少冲突
【发布时间】:2009-03-24 09:32:00
【问题描述】:

我很难理解这一点,需要一些帮助来理解 shift reduce 和 reduce reduce 冲突。我有一个语法,我似乎无法理解它为什么会出现问题。我可以附上语法,但我想了解它是如何工作的。

第一个问题,Mgrammer 创建什么类型的解析器?据我了解,shift reduce 和 reduce reduce 冲突取决于解析器的类型。

第二个问题,什么表示减少减少冲突,什么表示转移减少冲突?

我了解词法分析和形式语法的基础知识,但我从事语言设计工作已经有一段时间了,所以这里的任何帮助都非常适合。

更新:

我正在使用一种重要的空格语言,我想知道在 MGrammar 中这样做的可能性,我是否需要先看一下才能解决歧义?

【问题讨论】:

    标签: oslo shift-reduce-conflict mgrammar reduce-reduce-conflict


    【解决方案1】:

    简单示例:

    if cond
        if cond2
            cmd
        else
            cmd2
    

    问题:else 属于哪里?对于人眼,缩进表示“到第二个if”,但这对计算机没有任何意义(除非使用Python ;))。这是shift/reduce conflict

    一个优雅的解决方案是将else 视为最高优先级的左绑定运算符(这使其“挂”到最接近的if)。

    reduce/reduce conflict 是模棱两可的。我没有很好的例子,但这意味着语法中有一些路径,其中一个标记可能导致两个规则同时减少,并且没有额外的信息来决定哪个规则应该优先。

    [编辑]野牛文档有一个example for reduce/reduce

    【讨论】:

    • 好的,但是空白和 Markdown 呢?我担心 Markdown 无法用 mgrammar 正确解析。这就是正式语言和非正式语言的不匹配。
    • 在这种情况下,您必须将空格转换为标记(而不是“忽略”它)。
    • 好的,我花了一段时间才弄清楚这一点,所以需要一个纯文本描述为什么会发生 shift/reduce 和 reduce/reduce 冲突。我的问题是我在看我的语法,好像它产生歧义是可以的。实际上,这些歧义会产生解析结构,使解析器处于无法自行继续的情况。这使我得出结论,编程语言包含某些字符的原因是为了以一种方式解决这些歧义。在我的语法中,空格仅仅意味着许多不同的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多