2016-12-06 106 views
0

我是Lex/Yacc編程中的新成員。我有一個關於如何從另一個C文件中調用Yacc文件中的函數的問題。假設我有以下萊克斯/ Yacc的代碼:從另一個c文件調用Yacc文件中的函數

calc.l

%{ 
#include "y.tab.h" 
extern int yylval; 
%} 

%% 
[0-9]+  { yylval=atoi(yytext); return NUMBER;} 
[ \t];           
\n   return 0;        
.   return yytext[0];      

%% 

calc.y

%{ 
#include <stdio.h> 
%} 
%token NAME NUMBER 

%% 
statement: NAME '=' expression 
|  expression {printf("= %d\n",$1); printf("yylval= %d",yylval);} 
; 
expression: NUMBER '+' NUMBER {$$=$1+$3;} 
|  NUMBER '-' NUMBER {$$=$1-$3;} 
|  NUMBER 'x' NUMBER {$$=$1*$3;} 
|  NUMBER '/' NUMBER 
       { if($3 == 0) 
         yyerror("Error, cannot divided by zero"); 
        else 
         $$=$1/$3; 
       } 
|  NUMBER   {$$=$1;} 
; 
%% 

void parse() 
    { 
    while(1) 
     { 
     printf("Please enter numerical expression here: "); 
     yyparse(); 
     } 
    } 

我創建了一個main.c文件,這樣我就可以打電話函數void parse()在Yacc文件中是這樣的:

main.c

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include "y.tab.c" 
#include "lex.yy.c" 

int main(int argc,char* argv[]) 
    { 
    parse(); 
    } 

的問題是我怎麼能叫無效解析()函數main.c中,如何編譯main.c中與Lex和Yacc文件一起。我曾與

  1. 的yacc -d calc.y試圖
  2. 法calc.l
  3. 的gcc -o主要的main.c

但沒有奏效。

+2

你應該告訴我們爲什麼它不起作用,你得到了什麼信息!我建議你嘗試:'gcc -o main calc.tab.y main.c'。 –

+1

你不應''將''y.tab.c'或'lex.yy.c'包含到你的主源文件中。您可以在同一個'gcc'命令中編譯它們(只需將源文件名添加到您已有的'gcc'命令中),或者可以將它們分別編譯爲目標文件('gcc -c'),然後將其鏈接到目標文件一起。然而,這可能與您的問題有關,也可能沒有任何關係。 –

+0

非常感謝Brian Tompsett和John Bollinger。它現在有效 – Hajime

回答

0

嘗試編譯的所有文件一起如下:

GCC的lex.yy.c y.tab.c的main.c中-o主要

並嘗試運行它,如下所示:

./main

相關問題