2012-12-26 57 views
1

我試圖用flex和bison來創建一個簡單的calc,但是當我嘗試編譯時我收到錯誤,我沒有在YACC或FLEX中體驗這是我的第一個程序。YACC&Lex未定義對`yylex'的引用

撓曲2.5.35,野牛(GNU野牛)2.3,GCC(Debian的4.3.2-1.1)4.3.2,LINUX 2.6.26-1-686

這是錯誤:

bison -d -y math.yacc -b math 
lex -P math math.lex 
gcc lex.math.c math.tab.c -g -Wall -lfl -ll -o math.parse.so 
math.tab.c: In function ‘yyparse’: 
math.tab.c:1244: warning: implicit declaration of function ‘yylex’ 
/tmp/ccOhwzV0.o: In function `yyparse': 
/root/.netbeans/remote/192.168.56.101/silenobrito-nb-Windows-x86_64/D/source/lib-  math/src/model/math.tab.c:1244: undefined reference to `yylex' 
collect2: ld returned 1 exit status 
make: ** [math.parse.so] Erro 1 
athenas:~/.netbeans/remote/192.168.56.101/silenobrito-nb-Windows-x86_64/D/source/lib-math/src/model# 

這是我的Makefile:

## -*- Makefile -*- 
## 
## Usuário: silenobrito 
## Hora: 25/12/2012 17:21:13 
## Makefile created by Oracle Solaris Studio. 
## 
## Este arquivo é gerado automaticamente. 
## 
CC=gcc 
CFLAGS=-g -Wall -lfl -ll 
LEX=lex 
#YACC=yacc -d 
#LEX=flex 
YACC=bison -d -y 

all: lex.math.c math.tab.c math.parse.so 

## Destino: lex.math.c 
lex.math.c: math.tab.c 
    $(LEX) -P math math.lex 

## Destino: math.tab.c 
math.tab.c: math.yacc math.lex 
    $(YACC) math.yacc -b math 

## Destino: math.parse.o 
math.parse.so: math.tab.c math.tab.h lex.math.c 
    $(CC) lex.math.c math.tab.c $(CFLAGS) -o [email protected] 

#### Limpar o destino deleta todos os arquivos gerados #### 
clean: 
    rm -fr math.tab.c math.tab.h lex.math.c 

# Ativar verificação de dependências 
.KEEP_STATE: 
.KEEP_STATE_FILE:.make.state.GNU-amd64-Linux 

這是我的YACC文件:

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define YYSTYPE double 

#ifdef __cplusplus 
extern "C" { 
#endif 
    int yyerror(char *message); 
#ifdef __cplusplus 
} 
#endif 


%} 
%start solve 
%token END_OF_LINE ADD SUB OPEN_PARENTHESIS CLOSE_PARENTHESIS NUMBER 
%left ADD SUB 
%% 

solve : expr END_OF_LINE 
     { 
      printf("resposta: %lf\n", $1); 
      return EXIT_SUCCESS; 
     } 
expr : expr ADD expr 
     { 
      $$ = $1 + $3; 
     }| expr SUB expr 
     { 
      $$ = $1 - $3; 
     }| OPEN_PARENTHESIS expr CLOSE_PARENTHESIS 
     { 
      $$ = $2; 
     }| NUMBER; 
%% 

int yyerror(char *message) { 
    fprintf(stderr, "%s\n", message); 
    return EXIT_FAILURE; 
} 

int main(int argc, char ** argv) { 
    return yyparse(); 
} 

這是我的LEX文件:

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include "math.tab.h" 
#define _POSIX_SOURCE 1 

int decValue; 
%} 

%option nounput 
%option noinput 
%option noyywrap 

%% 
add     return ADD; 
sub     return SUB; 
[0-9]+    {yylval = atof(yytext); return NUMBER;}; 
0x[0-9a-fA-F]+  {sscanf(yytext, "%x", &decValue); yylval = decValue; return NUMBER;}; 
\(     return OPEN_PARENTHESIS; 
\)     return CLOSE_PARENTHESIS; 
\n     return END_OF_LINE; 
.     ; 
%% 
+2

你的第一個使用新語言的程序應該是'HelloWorld'。如果你試圖用兩種新語言編寫兩個不平凡的例程並將它們連接在一起,你就會尋求奇蹟。 – Beta

+1

不要將開發工作做成'root';這太危險了! –

回答

3

的問題是在你的Makefile:

$(LEX) -P math math.lex 

的 '-p' 選項定義代替 'YY' 中使用的前綴,那麼「 yylex'正在改爲'mathlex'。

改爲使用$(LEX) --outfile=lex.math.c math.lex