使用一元+和 - 的算术表达的明确语法

时间:2011-07-14 17:13:02

标签: grammar compiler-theory

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

我提出了以下

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

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

3 个答案:

答案 0 :(得分:2)

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

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

而不是:

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

答案 1 :(得分:0)

我认为你有一个额外的制作规则

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

可缩小为

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

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

答案 2 :(得分:0)

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