2017-01-16 15 views
0

私は、次のyacc文法を持っている:警告:文法での非終端無用:const_declaration [-Wother]

%{ 
#include <stdio.h> 
extern FILE* yyin; 
extern char* yytext; 

%} 

%token VAR ID_NAME TYPE_STRING TYPE_BOOL TYPE_NUMBER CONST 

%% 

var_declaration: VAR ':' type ID_NAME ';' { printf("var\n"); } 
    ; 

const_declaration: CONST ':' type ID_NAME ';' {printf("const\n");} 
    ; 

type: TYPE_NUMBER 
    | TYPE_STRING 
    | TYPE_BOOL 
    ; 

%% 
void yyerror (char const *s) { 
    fprintf (stderr, "%s\n", s); 
} 

int main(int argc, char** argv[]) 
{ 

    yyparse(); 
    return 0; 
} 

それは、この時点でフォームvar:<type> <name>;と定数の宣言の変数宣言を可能にしなければならないことはほとんどの言語を記述する必要があります形式はです。私はyacc -vd grammar.yを実行すると

私が取得: yaccの-vd grammar.y

grammar.y: warning: 1 nonterminal useless in grammar [-Wother] 
grammar.y: warning: 1 rule useless in grammar [-Wother] 
grammar.y:16.1-17: warning: nonterminal useless in grammar: const_declaration [-Wother] 
const_declaration: CONST ':' type ID_NAME ';' {printf("const\n");} 
^^^^^^^^^^^^^^^^^ 
grammar.y:16.20-67: warning: rule useless in grammar [-Wother] 
const_declaration: CONST ':' type ID_NAME ';' {printf("const\n");} 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

は、なぜそれがconst_declarationルールは無用であると言うのでしょうか?

答えて

2

このエラーメッセージが表示される理由は、規則const_declarationが他の規則には表示されないため、文法には不要です。

ルールvar_declarationは、startルール(最初のルールを使用して指定していないため)と解釈されます。このルールはtypeルールのみを使用するため、他のすべてのルールは重複しています。

これはおそらくより大きな文法のサブセットですか?すべての文法がファイル内にあり、const_declarationルールがどこかで使用されると、エラーは消えてしまいます。

+0

あなたは正しいです。変数と定数の両方のルールは、(まだ定義されていない)プログラムルールのコンポーネントです。 – cristid9

関連する問題