语法LL(1)悬空其他和共同的左前缀

时间:2015-09-29 23:10:25

标签: regex compiler-construction grammar ll

我相信阅读它的每个人都熟悉悬崖的模棱两可。因此,我将跳过解释。 我在编译器书(龙书)上找到了一个代表IF和ELSE的不明确的语法。在这里。

stmt->matched_stmt | open_stmt
matched_stmt->if exp then matched_stmt else matched_stmt | other
open_stmt->if exp then stmt | if exp then matched_stmt else open_stmt

问题是:

  

open_stmt->如果是exp然后是stmt |如果是exp则match_stmt否则为open_stmt

为了使语法我在LL(1)语法上工作,我需要消除左公共前缀,在这种情况下,左公共前缀是:

  

如果是exp那么

当我尝试工作时,它再次变得模棱两可,这就是我尝试过的。

stmt->matched_stmt | open_stmt
matched_stmt->if exp then matched_stmt else matched_stmt | other
open_stmt->if exp thenO'
O'->stmt | matched_stmt else open_stmt

哪个是含糊不清的,任何人都可以帮助我使它不具有暧昧且没有共同的左前缀?非常感谢你

1 个答案:

答案 0 :(得分:1)

我不相信有可能编写LL(1)语法来处理悬空其他语法,尽管编写一个递归下降解析器是很容易的。

在递归下降解析器中,当您在表达式之后解析第一个语句时,如果看到else,则继续生成。否则,您已完成解析if语句。换句话说,您只需贪婪地解析else子句。

但是那个算法不能表示为CFG,而且我总是认为不可能编写一个明确的LL(1)CFG来处理悬空,因为当你到达S1的开头时

if E then S1 ...

你仍然不知道属于哪个生产。事实上,直到你到达S1结束时你都不知道,无论k有多大,做出LL(k)决定肯定为时已晚。

然而,这种解释有很多挥手,我从来没有发现它完全令人满意。所以我很高兴拿起我的龙书(1986年版)并阅读,第192页(" LL(1)语法"在4.4节,"自上而下的语法&# 34;)语法4.13(if-then-optional-else语法)"根本没有LL(1)语法"。

以下段落以健全的建议结束:"如果LR解析器生成器......可用,则可以自动获得预测解析和运算符优先级的所有好处。"我的边缘记录(从1986年左右开始,我猜)读到了#34;那么为什么我只研究整章呢?&#34 ;;今天,我倾向于对龙书的作者更慷慨,但是没有暗示任何人实际上使用一个解析器生成器,它至少不如LALR(1)解析器生成器。