我刚刚开始自学龙书编译器设计。我正在研究一个问题,即为包含二进制+, - ,*,/和一元+的表达式设计语法, -
我提出了以下
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
必须有效。如何设计这样的语法?
答案 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}}必须添加到生产规则!!