2009-11-16 117 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 {};