【问题标题】:Call a function in a Yacc file from another c file从另一个 c 文件调用 Yacc 文件中的函数
【发布时间】: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():

ma​​in.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 文件。我试过了

  1. yacc -d calc.y
  2. lex calc.l
  3. gcc -o main main.c

但它没有用。

【问题讨论】:

  • 您应该告诉我们为什么它不起作用以及您收到了什么信息!我建议你试试:gcc -o main calc.tab.y main.c.
  • 您不应将#include y.tab.clex.yy.c 放入主源文件中。您可以在同一个 gcc 命令中编译它们(只需将源文件名添加到您已有的 gcc 命令中),或者您可以将它们分别编译为目标文件(gcc -c),然后链接目标文件一起。但是,这可能与您的问题有关,也可能无关。
  • 非常感谢 Brian Tompsett 和 John Bollinger。它现在工作了

标签: c yacc lex


【解决方案1】:

尝试如下编译所有文件:

gcc lex.yy.c y.tab.c main.c -o main

并尝试如下运行:

./main

【讨论】:

    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 2020-04-26
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多