【问题标题】:Unambiguous grammar for arithmetic expression with Unary + and -具有一元 + 和 - 的算术表达式的明确文法
【发布时间】:2011-07-14 17:13:01
【问题描述】:

我刚刚开始自学编译器设计的龙书。我正在研究一个问题,说要为包含二进制 +,-,*,/ 和一元 +,- 的表达式设计语法

我想出了以下方法

E -> E+T | E-T | T
T -> T*P | T/P | P
P -> +S | -S | S
S -> id | constant | (E)

但是,它有一个明显的缺陷。根据这个语法,像

这样的表达式
1--3

是有效的,这是我所知道的所有编程语言中的一个错误。不过,像

这样的表达
1+-+3
and
1- -3

必须有效。如何设计这样的语法?

【问题讨论】:

  • 1+-+3 是什么意思?
  • 如果1- -3 有效,为什么1--3 无效?我看到的唯一原因是一元 -- 运算符,而你没有。
  • @sepp2k - 我试图在这里模拟 C 语言的行为。 -- 是 C 中的有效标记,因此 1--3 无效
  • @Gabe - 这意味着-2。它被评估为 13

标签: grammar compiler-theory


【解决方案1】:

我相信您的问题在于标记化。您将1--3 识别为错误,因为您认为它应该被解析为1 --3 而不是1 - -3,后者是完全有效的。所以我认为你的问题来了,因为当你标记你得到的字符串时:

['1', '-', '-' , '3']

而不是:

['1', '--', '3']

【讨论】:

    【解决方案2】:

    我认为你有一个额外的生产规则

    P -> +S | -S | S
    S -> id | constant | (E)
    

    可以缩小到

    P -> +P | -P | id | constant | (E)
    

    使用这样的语法,您将成功地将 exp "1+-+3" 匹配为有效。

    【讨论】:

      【解决方案3】:

      你有tokenizer(scanner) 问题!在将令牌传递给解析器之前您必须区分“-”和“--”。您必须定义一个包含令牌类型和值的令牌结构,然后解析令牌列表。 还必须将规则P->--S 添加到生产规则中!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-08
        • 2015-07-02
        相关资源
        最近更新 更多