【问题标题】:BNF ambiguitiesBNF 歧义
【发布时间】:2020-05-26 07:00:16
【问题描述】:

“编译器构造”一书给出了 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

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

【问题讨论】:

  • 您确定引用正确吗?和你一样,我没有看到这里的歧义,但是这个问题让我想起了dangling else 问题。
  • 我也是,也许是答案;那么如何在 BNF 中添加括号呢?
  • 这里没有“悬空其他”问题。 else 存在且必须存在,因为条件表达式需要“else”子句;因此,条件 表达式——与条件语句相反——不会表现出“悬空的 else”歧义。
  • 非常感谢您的帮助

标签: compiler-construction bnf


【解决方案1】:

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

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

但如果b 是算术,那么它是算术条件表达式IF a THEN b ELSE cd 之间的比较(同样,cd 必须具有算术类型)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多