Compiler construction 这是不是一个模棱两可的语法?

Compiler construction 这是不是一个模棱两可的语法?,compiler-construction,grammar,context-free-grammar,ambiguity,Compiler Construction,Grammar,Context Free Grammar,Ambiguity,我试图找出以下语法是含糊不清的还是毫不含糊的: stmt->IF expr THEN stmt | matchedsmt matchedsmt->IF expr然后matchedsmt ELSE stmt | other 它实现if-then-else结构 expr和other被认为是终端符号,因为在这个问题中我们不关心它们 我一直试图找到一个包含多个解析树的字符串,但我找不到 你能帮帮我吗?语法模棱两可,尽管方向正确:) 这里有一个模棱两可的地方: IF c1 THEN IF c2 THEN

我试图找出以下语法是含糊不清的还是毫不含糊的:

stmt->IF expr THEN stmt | matchedsmt

matchedsmt->IF expr然后matchedsmt ELSE stmt | other

它实现if-then-else结构

expr
other
被认为是终端符号,因为在这个问题中我们不关心它们

我一直试图找到一个包含多个解析树的字符串,但我找不到


你能帮帮我吗?

语法模棱两可,尽管方向正确:)

这里有一个模棱两可的地方:

IF c1 THEN IF c2 THEN s2 ELSE IF c3 THEN s3 ELSE s4
由于
如果c2,则s2,如果c3,则s3可以减少为:

IF c2 THEN matchedStmt ELSE stmt
这是一个
匹配的stmt
。因此,
ELSE s4
是否属于
IF c3
IF c1
是不明确的


您需要的是使
matchedsmt
ELSE
的两侧完全匹配,如下所示:

stmt -> matchedStmt | unmatchedStmt

matchedStmt -> IF expr THEN matchedStmt ELSE matchedStmt
            |  other

unmatchedStmt -> IF expr THEN stmt
              |  IF expr THEN matchedStmt ELSE unmatchedStmt

现在清楚了!我试图通过查找由两个解析树生成的字符串来确定它是否是不明确的,就像我在第一个语法中所做的那样,但我做不到。我认为这是证明这一点的唯一方法,但是,是的,我们可以这样说,关于“ELSE s4”,它在哪里匹配并不明显。非常感谢!:)