【发布时间】:2016-12-06 16:05:44
【问题描述】:
我是 Lex/Yacc 编程的新手。我有一个关于如何从另一个 C 文件调用 Yacc 文件中的函数的问题。假设我有以下 Lex/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 文件,因此我可以像这样在 Yacc 文件中调用函数 void parse():
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 中调用 void parse() 函数以及如何编译 main.c 以及 Lex 和 Yacc 文件。我试过了
- yacc -d calc.y
- lex calc.l
- gcc -o main main.c
但它没有用。
【问题讨论】:
-
您应该告诉我们为什么它不起作用以及您收到了什么信息!我建议你试试:
gcc -o main calc.tab.y main.c. -
您不应将
#includey.tab.c或lex.yy.c放入主源文件中。您可以在同一个gcc命令中编译它们(只需将源文件名添加到您已有的gcc命令中),或者您可以将它们分别编译为目标文件(gcc -c),然后链接目标文件一起。但是,这可能与您的问题有关,也可能无关。 -
非常感谢 Brian Tompsett 和 John Bollinger。它现在工作了