【发布时间】:2019-06-13 18:05:26
【问题描述】:
这是我的语法:
%% Start : _PROGRAM _ID _SEMI Block
Block : Declarations BlockStatements
Declarations : _VAR _LPAREN VariableDeclarions _SEMI _RPAREN _ADD
| ;
VariableDeclarions : _ID _LPAREN _COMMA _ID _RPAREN _MULT _COLON TypeSpec
TypeSpec : _INTEGER
| _REAL
BlockStatements : _BEGIN Statements _END
| ;
Statements : Assignment W
| ;
W : Statements
Statement : Assignment
| ;
Assignment : _ID _ASSIGN Expr _SEMI
Expr : Term _LPAREN _ADD Term _RPAREN _MULT
| Term _LPAREN _SUB Term _RPAREN _MULT
| Term _LPAREN _MULT
| Term _LPAREN _DIV _RPAREN _MULT
Term : _CONST
| _LPAREN Expr _RPAREN
| _ID
我收到如下错误: 2 条规则从未减少。
谁能帮我解决问题?
我无法纠正语法。
【问题讨论】:
-
请添加您收到的实际错误消息。
-
2 条规则从未减少
-
不相关。标记名称在 C 程序中成为符号——
enum成员,如果您使用的是 flex——则它们需要符合 C 命名规则。并且 C 命名规则保留所有以下划线和大写字母开头的名称,因此使用这些名称是 C 标准的未定义行为。如果您不想只使用通常的约定的单词,您可以使用T_或TOK_之类的前缀来修饰它们,而不仅仅是一个下划线。
标签: compiler-construction yacc lex