c - Bison-Flex extern FILE *yyin 不工作(C 语言)

标签 c parsing bison flex-lexer lexical-analysis

我知道在 flex 中你只需要执行 yyin = fopen(filename, "r"); 来读取文件,但是如果你想从 bison 中读取文件怎么可能呢?我正在尝试将 flex 和 bison 结合起来用于我的目的(使用 4 + 5 + 7; 读取文件并打印结果)但是我很难尝试从 bison 打开文件。我尝试在报关室使用 extern FILE *yyin 然后使用 yyin = fopen(filename, "r"); 但我得到了错误:

C2065: 'yyin' : undeclared identifier.

这是我的代码,以防它有助于找到它。

Bison 代码:

%{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
extern FILE *yyin;
int yyerror(char *message)
{
    return 0;
}
%}

%union {
 double val;
 char sym;
}   
%token <val> NUMBER
%token <sym> PLUS Q_MARK
%type <val> addition_list addition
%start addition_list
%%

addition_list : addition Q_MARK  {printf("apotelesma: %d\n", $1);}
| addition_list addition Q_MARK  {}
;

addition : NUMBER PLUS NUMBER {$$ = $1 + $3;}
| addition PLUS NUMBER {$$ = $1 + $3;}
;

%%
void main(int argc, char *argv[])
{
    yyin = fopen("argv[1]", "r");
    yyparse();
}

弹性代码:

%option noyywrap
%{
#include "flex2.tab.h"
%}

%%
\+ { flex2lval.sym = yytext[0];printf("%c\n", yytext[0]);  return PLUS; }
; { flex2lval.sym = yytext[0]; return Q_MARK; }
0|([-+]?(([1-9][0-9]*)|(0\.[0-9]+)|([1-9][0-9]*\.[0-9]+))) {flex2lval.val = atof(yytext); return NUMBER; }
%%

最佳答案

您是否编译了 flex 生成的文件以及 bison 生成的文件?

flex lexical_file.l(生成 lex.yy.c)

bison -d syntax_file.y(生成 syntax_file.tab.c 和 syntax_file.tab.h)

gcc syntax_file.tab.c lex.yy.c -lfl -o myparser.out

您还应该删除“argv[1]”周围的引号。它应该是 yyin = fopen(argv[1], "r"); 如果你想成功打开作为第一个参数传递给解析器的文件而不是试图打开一个文件实际上是命名“argv[1]”。

关于c - Bison-Flex extern FILE *yyin 不工作(C 语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21896315/

相关文章:

c -/usr/include/stdio.h 中的 "#define stdin stdin"应该如何工作?

java - 解析文本以查找地理名称

python - 在 Python 中解析 JSON 对象时遇到问题

parsing - 识别文本文件中模式的软件

parsing - Flex 和 Bison - 有时关心空格的语法

c++ - Flex Bison 构造的编译器打印正确的结果然后给出语法错误

c - 为什么访问我的结构会减慢我的方法执行速度

c - Linux 上具有单独数据段的库的多个实例

c++ - 使用 GDB 调试时如何知道 bison 中变量的值?

c - 为什么复制字符串时缓冲区溢出?