减少错误可以帮助我使用此lex和grammer代码

时间:2019-06-13 18:05:26

标签: 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 : _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条规则从未减少。

有人可以帮我解决问题吗?

我无法纠正语法。

1 个答案:

答案 0 :(得分:1)

当我通过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

因此,根据输出的最后一部分,Statement是无用的。因此,让我们看一下Statement在语法中的使用位置:不是。您定义了Statement,但从未在任何地方使用它。所以这就是为什么它没用的原因以及收到警告的原因。