Я получаю это сообщение "правило бесполезно в грамматике" - PullRequest
0 голосов
/ 08 июля 2019

Я новичок в зубрах.Я написал несколько правил, но я получил много «правил, бесполезных в грамматике».

Я думаю, что «expr» вызывает эту проблему.Пожалуйста, помогите мне.

image of result

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     
;

1 Ответ

1 голос
/ 08 июля 2019

Проблема в том, что statement имеет только рекурсивные правила.Это делает невозможным использование statement в деривации, потому что любая деривация, начинающаяся с statement, никогда не заканчивается.

Поскольку statement не может использоваться для анализа любой конечной строки, Bison удаляет ее и все ее правила изграмматика, а также любые правила, которые используют statement.После удаления этих правил expr и Params больше не упоминаются в грамматике, поэтому они также помечаются как бесполезные.

Вы, вероятно, намеревались statement иметь другие нерекурсивные альтернативы, такие каккак expr.

...