2012-11-09 78 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 –