Compiler construction 减少错误有人能帮我处理这个lex和grammer代码吗
这是我的语法:Compiler construction 减少错误有人能帮我处理这个lex和grammer代码吗,compiler-construction,yacc,lex,Compiler Construction,Yacc,Lex,这是我的语法: %% 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
%% 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条规则从未减少 有人能帮我解决这个问题吗
我无法更正语法。当我通过
bison
运行您的语法时(添加缺少的%token
定义后),我得到以下输出:
bla.y: warning: 1 nonterminal useless in grammar [-Wother]
bla.y: warning: 2 rules useless in grammar [-Wother]
bla.y:17.1-9: warning: nonterminal useless in grammar: Statement [-Wother]
Statement : Assignment
因此,根据输出的最后一部分,
语句
是无用的。那么让我们看看语句在语法中的使用位置:它不是。您定义了语句
,但从未在任何地方使用它。这就是为什么它毫无用处,也就是为什么您会收到警告。请添加您收到的实际错误消息。2条规则永远不会减少。如果使用flex,令牌名称将成为C程序中的符号--enum
成员,因此它们需要符合C命名规则。C命名规则保留所有以下划线和大写字母开头的名称,因此使用这些名称是C标准未定义的行为。如果你不想只使用这些词,这是通常的惯例,你可以用前缀来修饰它们,比如t_
或TOK_
,而不仅仅是一个下划线。