2012-11-09 4 views
0
나는 다음과 같은 간단한 프로그램을 컴파일하고 실행하기 위해 노력하고있어

:Yacc에 렉스 오류 컴파일

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" 

나는 그와 함께 연결하고 파일을 컴파일하려고 그 후 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.c를 컴파일해야합니다.

+0

감사합니다. EJP. 그건 내 바보 같은 실수 야, y.tab.h를 사용하여 컴파일하려고했는데, y.tab.c로 시도해야했을 때. 이제 작동합니다. – lucianthomaz

+0

동일한 코드를 사용하여 'error :'yylval 'undeclared'를 얻습니다. @lucianthomaz가 y.tab.c를 작성하고 컴파일합니다. –