2017-01-16 6 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>; 및 상수 선언 양식은 const:<type> <name>;입니다. 내가 yacc -vd grammar.y을 실행하면

내가 얻을 : 은 yacc는

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 규칙이 쓸모가 있다고 않습니다에는 grammar.y -Vd?

답변

2

이 오류 메시지가 나타나는 이유는 const_declaration 규칙이 다른 규칙에 나타나지 않으므로 문법에 필요하지 않습니다.

규칙 var_declaration시작 규칙 (첫 번째 규칙을 사용하는 시작을 지정하지 않았으므로)으로 간주됩니다. 이 규칙은 type 규칙 만 사용하므로 다른 모든 규칙은 중복되어 표시됩니다.

아마도 이것은 더 큰 문법의 하위 집합입니까? 모든 문법이 파일에 있고 어딘가에서 const_declaration 규칙을 사용하면 오류가 사라집니다.

+0

당신 말이 맞습니다. 변수와 상수에 대한 규칙은 (아직 정의되지 않은) 프로그램 규칙의 구성 요소입니다. – cristid9