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_
,而不仅仅是一个下划线。