Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 语法LL(1)悬挂else和公共左前缀_Regex_Compiler Construction_Grammar_Ll - Fatal编程技术网

Regex 语法LL(1)悬挂else和公共左前缀

Regex 语法LL(1)悬挂else和公共左前缀,regex,compiler-construction,grammar,ll,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

我相信每一个读过它的人都熟悉悬而未决的模棱两可。因此,我将跳过解释。 我在一本编译器的书(龙书)上发现了一个不含糊的语法,它表示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
问题是:

打开\u stmt->if exp then stmt | if exp then matched \u stmt else open \u 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

这是含糊不清的,谁能帮我使它不含糊不清,没有共同的左前缀?非常感谢

我认为不可能编写一个LL(1)语法来处理悬挂的else,尽管编写一个递归下降解析器来处理悬挂的else很简单

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

但该算法不能表示为CFG,我一直认为不可能编写一个明确的LL(1)CFG来处理悬空的ELSE,因为当您在

if E then S1 ...
你仍然不知道这是哪部作品的一部分。事实上,直到你到达S1的末尾你才知道,这肯定是太晚了,无法做出LL(k)决定,不管k有多大

然而,这一解释引起了很多人的共鸣,我从来没有觉得它完全令人满意。因此,我很高兴地拿起我那本破旧的《龙书》(1986年版),在第192页(“第4.4节“自上而下语法”中的“LL(1)语法”)上读到语法4.13(if-then可选else语法)“根本没有LL(1)语法”


下面的段落以合理的建议结尾:“如果LR解析器生成器……可用,您可以自动获得预测性解析和运算符优先级的所有好处。”我的旁注(我猜是1986年左右)写道“那么我为什么要学习这整章??”;今天,我倾向于对《龙之书》的作者更加慷慨,但不是建议任何人实际使用的解析器生成器至少不如LALR(1)解析器生成器强大。

奇怪的是,认为必须处理if和else的语法不能是LL(1)。我尝试了很多方法,但每次我的解析表都变得模棱两可(两个不同的结果都是相同的非终结值)。“我想就是这样了,非常感谢。”布鲁诺布拉加为什么一定是LL(1)?LL(1)是一组非常严格的语法;有许多构造无法在LL(1)中充分表达。在LL(1)中无法正确编写简单的左联想表达式语法;您需要重新调整生成的右关联分析树以获得正确的关联性。在实践中,if-else歧义并不严重,因为(正如我所提到的)递归下降解析器可以很容易地做出正确的决定,从而避免歧义,大多数LL解析器生成器都会正确处理这一问题。但就我个人而言,我喜欢LR语法分析。没有理由,我只是想知道这是否可能,因为我现在正在学习LL(1)语法。