BNF歧义

问题描述 投票:0回答:1

““ Compiler construction”书给出了Algol 60原始定义的示例。它们包含歧义。

至少找到两个不同的结构用于

IF a THEN b ELSE c=d

有定义的一部分

unconditional Statement = basicStatement | forStatement | compoundStatement | ... .
ifStatement = "IF" BooleanExpression "THEN" unconditionalStatement.
conditionalStatement = ifStatement | ifStatement "ELSE" statement.

statement = unconditionalStatement | conditionalStatement. 

那么,因为:

A "else" B, and A => "if" a "then" b

我们得到:

if a then b else B

似乎Bc=d

歧义在哪里?如何找到两个不同的结构?

compiler-construction bnf
1个回答
0
投票

IF a THEN b ELSE c=d不是语句。这是某种表达。它是哪种类型取决于b的类型。 (该语句为IF a THEN b ELSE c:=d.,请回想一下,在Algol中,:=是赋值,=是相等比较,==是语法错误。)

如果b是布尔值,则它是一个布尔条件表达式,其替代值为bc=d;在这种情况下,c必须具有算术类型,因为语法不允许将布尔值与=进行比较。

但是如果b是算术的,那么它是IF a THEN b ELSE cd之间的比较(同样,c必须是算术的。

至少,这是我对语法的阅读。它不是完全模棱两可的,但是BNF不足以解析该解析,因为该语言不是上下文无关的。选择正确的语法分析需要前面的b声明,只有使用上下文相关的语法才能实现。

© www.soinside.com 2019 - 2024. All rights reserved.