Compiler construction 这是不是一个模棱两可的语法?
我试图找出以下语法是含糊不清的还是毫不含糊的: stmt->IF expr THEN stmt | matchedsmt matchedsmt->IF expr然后matchedsmt ELSE stmt | other 它实现if-then-else结构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
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”,它在哪里匹配并不明显。非常感谢!:)