我是野牛新手。我写了一些规则,但是我得到了很多“语法上无用的规则”。
我认为“ expr”会导致此问题。请帮助我。
File :
| class {printf("accepted");}
;
class : CLASS IDENT '{' function '}'
| CLASS IDENT '{' global '}'
;
global : data_type IDENT
;
function :
|data_type IDENT'('Params')' '{'statement'}'
|VOID IDENT'('Params')' '{'statement'}'
;
Params : data_type IDENT
| data_type IDENT',' Params
;
data_type : INT_T
|DOUBLE_T
|BOOL_T
|VOID;
;
statement : WHILE '(' expr')' statement
| FOR'('data_type IDENT '=' expr ';' expr ';' expr')' statement
;
expr: expr COMP expr
|expr '=' expr
|INT_T
|BOOL_T
;
答案 0 :(得分:1)
问题在于statement
仅具有递归规则。这使得statement
无法在派生中使用,因为任何以statement
开头的派生都不会终止。
因为不能使用statement
来解析任何有限字符串,所以bison将从语法中删除了它以及它的所有规则以及所有使用statement
的规则。删除这些规则后,expr
和Params
在语法中不再被引用,因此它们也被标记为无用。
您可能希望statement
拥有其他非递归替代项,例如expr
。