2016-10-20 14 views
0

を導出しませんこれはyaccのための私のコードです:スタートシンボルSTARTは、任意の文章%開始START

%{ 
    #include<stdio.h> 
    extern File *yyin; 
    extern int line; 
%} 
%token DATATYPE NUMBER ID RET MAIN KEYWORD AOP HEADER STB ENB 
%start START 
%% 
START:H MAIN STB S R ENB 

     H:HEADER H|HEADER 

     S:DS S 
     |ES S 
     |CS S 
     |; 
    DS:DATATYPE V';' 
     V:ID|V','ID 

    ES:ID'='V; 
     E:NUMBER|ID 

    CS:KEYWORD'('A')''{''}' 
     A:ID AOP ID|ID AOP NUMBER|'}''}' 

     R:RET NUMBER';' 

%% 
    int main() 
    { 
     yyin=fopen("client.c","r"); 
     yyparse(); 
    } 
    yyerror() 
    { 
      printf("\n ERROR AT LINE NO :%D",line); 
    } 

それは私に次のエラーを与えている:

yaac.y: warning: 11 nonterminals useless in grammar [-Wother]
yaac.y: warning: 18 rules useless in grammar [-Wother]
yaac.y:7.8-12: fatal error: start symbol START does not derive any sentence %start START

+0

はあなたのコードが実際にあります解読するのは難しい。 Yaccで通常使用されているイディオムに従ってコードを再フォーマットし、プロジェクト全体のダンプだけでなく、_最小限の例を作成してください。 –

答えて

2

コメントで示されているように、それは次のようになり適切なyacc/bison形式でコードを再フォーマットするのが最適です。特に、文法規則はページの左側(列1)から開始し、各規則はセミコロン;で終了する必要があります。セミコロンを紛失すると、あるルールを別のルールに実行することによってバイソンを混乱させることが可能になります。

これを実行すると、バイソンは、非終端記号Eが役に立たないことを示す、より明確なエラーメッセージを生成します。あなたはおそらく、あなたの文法上の誤りである任意のルールでEを使用していない:

yaac.y: warning: 1 nonterminal useless in grammar
yaac.y: warning: 2 rules useless in grammar
yaac.y:29.1: warning: nonterminal useless in grammar: E
yaac.y:29.3-8: warning: rule useless in grammar: E: NUMBER
yaac.y:29.10-11: warning: rule useless in grammar: E: ID

ただ、完全を期すために、これはあなたの文法ファイルが整理された後にどのように見えるかです:

%{ 
    #include<stdio.h> 
    extern File *yyin; 
    extern int line; 
%} 
%token DATATYPE NUMBER ID RET MAIN KEYWORD AOP HEADER STB ENB 
%start START 
%% 
START:H MAIN STB S R ENB 
    ; 

H:HEADER H|HEADER 
    ; 

S:DS S 
     |ES S 
     |CS S 
     |; 

DS:DATATYPE V';' 
    ; 

V:ID|V','ID 
    ; 

ES:ID'='V; 
    ; 

E:NUMBER|ID 
    ; 

CS:KEYWORD'('A')''{''}' 
    ; 

A:ID AOP ID|ID AOP NUMBER|'}''}' 
    ; 

R:RET NUMBER';' 
    ; 

%% 
    int main() 
    { 
     yyin=fopen("client.c","r"); 
     yyparse(); 
    } 
    yyerror() 
    { 
      printf("\n ERROR AT LINE NO :%D",line); 
    } 
関連する問題