2009-11-16 115 views
3

當我運行以下文件我收到以下錯誤YACC -d parser.y:這個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 

我特別關注的是如何擺脫致命錯誤。

%{ 
#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:你有一些工作! – RageZ 2009-11-16 01:08:54

+0

@RageZ哈哈,我對這件事情無能爲力:[ – 2009-11-16 01:25:15

回答

5

所有這些警告和錯誤是由缺少|term前將expression規則造成的。提示是一個片段中未使用的$4,顯然應該只有3個參數。這個問題涉及所有其他問題。

變化:

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

到:

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

,然後再試一次。

+0

男人,我剛剛爲這個類型的問題摔跤了*小時*!太糟糕了,我只能一勞永逸! – JXG 2012-07-18 09:57:59

1

你忘了或|這裏

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

的最後一個規則應該是|term {};