使用 Yacc 和 Lex 生成解析树

Using Yacc and Lex to generate parse tree

我已经花了 6 个小时用 Lex 和 Yacc 为下面的产品编写编译器。终端报告 warning: empty rule for typed nonterminal, and no action 但我仍然无法找出我的代码有什么问题。

P -> L | LP
L -> S
S -> ID = E | if C the S | if C then S else S
C -> E>E | E<E | E=E 
E -> E+T | E-T | T
T -> F | T*F | T/F
F -> (E)| ID

yacc part code

lex part code

您收到的警告似乎完全准确:

F:      | …

F是一个non-terminal;它有一个类型,第一个选择是空的,没有任何动作。如果 non-terminal 的产生式没有动作,bison 会自动添加动作 $$ = ,但它不能为空产生式添加动作,所以它会抱怨。

我认为该行中的 | 是错字。