““ 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
似乎B
是c=d
歧义在哪里?如何找到两个不同的结构?
IF a THEN b ELSE c=d
不是语句。这是某种表达。它是哪种类型取决于b
的类型。 (该语句为IF a THEN b ELSE c:=d.
,请回想一下,在Algol中,:=
是赋值,=
是相等比较,==
是语法错误。)
如果b
是布尔值,则它是一个布尔条件表达式,其替代值为b
和c=d
;在这种情况下,c
必须具有算术类型,因为语法不允许将布尔值与=
进行比较。
但是如果b
是算术的,那么它是IF a THEN b ELSE c
和d
之间的比较(同样,c
必须是算术的。
至少,这是我对语法的阅读。它不是完全模棱两可的,但是BNF不足以解析该解析,因为该语言不是上下文无关的。选择正确的语法分析需要前面的b
声明,只有使用上下文相关的语法才能实现。