2017-01-09 5 views
4

Iam versucht, ein Programm für einen Taschenrechner mit lex und yacc zu entwickeln. Ich bekomme immer den folgenden Fehler:Schwerwiegender Fehler: Startsymbol leitet keinen Satz ab

calc.y: warning: 5 nonterminals useless in grammar [-Wother] 
calc.y: warning: 8 rules useless in grammar [-Wother] 
calc.y:8.1: fatal error: start symbol I does not derive any sentence 
I : E '\n' {printf("%d\n",$1);} 

Ich schaute auf ähnliche Probleme, aber sie hatten unendliche Rekursionen, aber diese hat nicht.

calc.l

%{ 
#include"y.tab.h" 
%} 

digits [0-9]* 

%% 
{digits} {return DIGITS} 
%% 

int yywrap() 
{ 
} 

calc.y

%{ 
    #include<stdio.h> 
%} 

%token DIGITS 

%% 
I : E '\n' {printf("%d\n",$1);} 
    ; 
E : E '+' F {$$ = $1 + $3;} 
    | E '-' F {$$ = $1 - $3;} 
    ; 
F : F '*' G {$$ = $1 * $3;} 
    | F '/' G {$$ = $1/$3;} 
G :'('E')' 
    | DIGITS 
    ; 
%% 

int main() 
{ 
    yyparse(); 
} 
int yyerror() 
{ 
} 

Antwort

3

Ich weiß nicht, yacc, aber:

  • Um eine I zu bauen, Sie brauche eine E:

    I : E '\n' 
    
  • eine E zu erstellen, benötigen Sie eine E:

    E : E '+' F 
        | E '-' F 
    

Da gibt es keine Möglichkeit ein E zu bauen, wenn Sie nicht bereits eines haben (und in am Anfang hast du nichts), es gibt auch keine Möglichkeit, eine I zu bauen.

Oder betrachten Sie es von der anderen Seite: E ist unendlich rekursiv, weil es immer auf sich selbst verweist.


Wenn wir mit dem Lexer beginnen, bekommen wir DIGITS zuerst.

DIGITS kann verwendet werden, um eine G zu bauen.

Aber es gibt nichts, was wir mit einem G tun können, weil die einzigen Regeln, die sie benutzen (F '*' G und F '/' G) auch eine F benötigen, um fortzufahren, und wir haben keine F. Also stecken wir fest.

+0

Aber am Ende verwenden wir den Token DIGITS.So sollte es dort enden –

+0

@anoop, aber Sie kommen nie zum Ende, weil 'E' nicht ein einzelnes' F' noch 'F' ein' G' ableiten kann . – rici

+0

@Anoopsaju Meine Antwort geändert. – melpomene

Verwandte Themen