2012-11-09 55 views
0

我试图编译并执行下面的程序:的Yacc和Lex错误编译

calculator.y

%{ 
    #include <stdio.h> 
    int yylex(void); 
    void yyerror(char *); 
%} 

%token INTEGER 

%% 

program: 
    program expr '\n'  { printf("%d\n", $2); } 
    | 
    ; 

expr: 
    INTEGER     { $$ = $1; } 
    | expr '+' expr   { $$ = $1 + $3; } 
    | expr '-' expr   { $$ = $1 - $3; } 

%% 

void yyerror(char *s) { 
    fprintf(stderr, "%s\n", s); 
} 

int main(void) { 
    yyparse(); 
    return 0; 
} 

calculator.l

%{ 
    #include <stdlib.h> 
    void yyerror(char *); 
    #include "y.tab.h" 
%} 

%% 

[0-9]+  { 
       yylval = atoi(yytext); 
       return INTEGER; 
      } 

[-+\n]  return *yytext; 
[ \t]  ; /* skip whitespace */ 
.   yyerror("invalid character"); 

%% 

int yywrap(void) { 
    return 1; 
} 

所以我与编译命令:

yacc -d calculator.y -> it generates "y.tab.c and y.tab.h" 

lex calculator.l -> it generates "lex.yy.c" 

An d之后,我尝试与连接在一起并编译文件:

cc lex.yy.c y.tab.h -ocalc 

但我有以下错误:

$ cc lex.yy.c y.tab.h -ocalc /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
0 has invalid symbol index 11 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
1 has invalid symbol index 12 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
2 has invalid symbol index 2 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
3 has invalid symbol index 2 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
4 has invalid symbol index 11 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
5 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
6 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
7 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
8 has invalid symbol index 2 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
9 has invalid symbol index 2 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
10 has invalid symbol index 12 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
11 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
12 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
13 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
14 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
15 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
16 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
17 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
18 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
19 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
20 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
21 has invalid symbol index 13 /usr/bin/ld: 
/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 
22 has invalid symbol index 21 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In 
function `_start': (.text+0x18): undefined reference to `main' 
/tmp/ccvaf6Nh.o: In function `yylex': lex.yy.c:(.text+0x1df): 
undefined reference to `yylval' lex.yy.c:(.text+0x205): undefined 
reference to `yyerror' collect2: ld returned 1 exit status 

任何人知道如何解决? 在此先感谢。

回答

2

这看起来像在C库中的腐败。重新安装编译器。

你应该编译y.tab.c,而不是y.tab.h.

+0

谢谢EJP。这是我的愚蠢的错误,我试图用y.tab.h进行编译,当时我应该尝试使用y.tab.c.它现在有效。 – lucianthomaz

+0

我得到'错误:'yylval'未声明',使用相同的代码@lucianthomaz写和编译y.tab.c –