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文件一起。我曾與
- 的yacc -d calc.y試圖
- 法calc.l
- 的gcc -o主要的main.c
但沒有奏效。
你應該告訴我們爲什麼它不起作用,你得到了什麼信息!我建議你嘗試:'gcc -o main calc.tab.y main.c'。 –
你不應''將''y.tab.c'或'lex.yy.c'包含到你的主源文件中。您可以在同一個'gcc'命令中編譯它們(只需將源文件名添加到您已有的'gcc'命令中),或者可以將它們分別編譯爲目標文件('gcc -c'),然後將其鏈接到目標文件一起。然而,這可能與您的問題有關,也可能沒有任何關係。 –
非常感謝Brian Tompsett和John Bollinger。它現在有效 – Hajime