2009-11-16 16 views
3

Quand je lance yacc -d parser.y sur le fichier suivant, je reçois les erreurs suivantes:Quel est le problème avec ce fichier yacc?

parser.y:23.3-24.4: warning: unused value: $4 
15 rules never reduced 
parser.y: warning: 7 useless nonterminals and 15 useless rules 
parser.y:16.1-14: fatal error: start symbol statement_list does not derive any sentence 
make: *** [y.tab.c] Error 1 

Je suis particulièrement préoccupé par la façon de se débarrasser de l'erreur fatale.

%{ 
#include "parser.h" 
#include <string.h> 
%} 
%union { 
double dval; 
struct symtab *symp; 
} 
%token <symp> NAME 
%token <dval> NUMBER 
%type <dval> expression 
%type <dval> term 
%type <dval> factor 
%% 

statement_list: statement '\n' 
| statement_list statement '\n' 
; 
statement: NAME '=' expression { $1->value = $3; } 
| expression { printf("= %g\n", $1); } 
; 
expression: expression '+' term { $$ = $1 + $3; } 
| expression '-' term { $$ = $1 - $3; } 
term 
; 

term: term '*' factor { $$ = $1 * $3; } 
| term '/' factor { if($3 == 0.0) 
yyerror("divide by zero"); 
else 
$$ = $1/$3; 
} 
| factor 
; 
factor: '(' expression ')' { $$ = $2; } 
| '-' factor { $$ = -$2; } 
| NUMBER 
| NAME { $$ = $1->value; } 
; 
%% 
/* look up a symbol table entry, add if not present */ 
struct symtab *symlook(char *s) { 
char *p; 
struct symtab *sp; 
for(sp = symtab; sp < &symtab[NSYMS]; sp++) { 
/* is it already here? */ 
if(sp->name && !strcmp(sp->name, s)) 
return sp; 
if(!sp->name) { /* is it free */ 
sp->name = strdup(s); 
return sp; 
} 
/* otherwise continue to next */ 
} 
yyerror("Too many symbols"); 
exit(1); /* cannot continue */ 
} /* symlook */ 
yyerror(char *s) 
{ 
printf("yyerror: %s\n", s); 
} 
+0

@ Jeremy: vous avez un peu de travail! – RageZ

+0

@RageZ haha, je ne peux pas aider beaucoup sur celui-ci: [ –

Répondre

5

Tous ces avertissements et les erreurs sont causées par le manque | avant term dans la règle expression. L'indice est le $4 inutilisé dans un extrait qui devrait contenir seulement 3 arguments. Ce problème cascade dans tous les autres.

Change:

expression: expression '+' term { $$ = $1 + $3; } 
| expression '-' term { $$ = $1 - $3; } 
term 
; 

dans:

expression: expression '+' term { $$ = $1 + $3; } 
| expression '-' term { $$ = $1 - $3; } 
| term 
; 

et essayez à nouveau.

+0

Homme, je luttais avec ce type de problème pour le moment * heures *! Dommage que je ne peux upvote qu'une seule fois! – JXG

1

vous oubliez le ou | ici

expression: expression '+' term { $$ = $1 + $3; } 
| expression '-' term { $$ = $1 - $3; } 
term 
; 

la dernière règle devrait être |term {};