2016-10-20 2 views
0

Dies ist mein Code für yacc:Startsymbol START leitet sich nicht jeder Satz% 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); 
    } 

Es gibt mir folgende Fehler:

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

Ihr Code ist wirklich schwer zu entziffern. Bitte formatieren Sie Ihren Code entsprechend den Idiomen, die normalerweise mit Yacc verwendet werden, und versuchen Sie, ein _minimal_ Beispiel zu erstellen, nicht nur einen Dump Ihres gesamten Projekts. –

Antwort

2

Wie in den Kommentaren angegeben, wäre es Am besten, den Code im richtigen Yacc/Bison-Format neu zu formatieren. Insbesondere sollten Grammatikregeln auf der linken Seite der Seite (Spalte 1) beginnen und jede Regel sollte durch ein Semikolon ; beendet werden. Durch das Fehlen der Semikola ist es möglich Bisons zu verwechseln, indem man eine Regel in eine andere umsetzt.

Danach erzeugt Bison eine klarere Fehlermeldung, die anzeigt, dass das Nicht-Terminal nutzlos ist. Sie haben nicht E in jeder Regel verwendet, die wahrscheinlich ein Fehler in der Grammatik ist:

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

Nur der Vollständigkeit halber, das ist, wie Sie Ihre Grammatik-Datei sieht nach in Ordnung gebracht werden:

%{ 
    #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); 
    }