2016-12-06 76 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

相关问题