YACC/LEX 从 C 文件调用解析器

YACC/LEX call the parser from C file

对于一个项目,我使用 yacc 和 lex/flex 来解析文件,我想从 .y.l 文件之外的其他地方调用解析器.

我可以调用 yyparse() 函数,但如果我只是这样做,它将从 stdin 读取,所以我更改了 yyin 以使其引用我的文件。但我无法在 .l 文件以外的其他地方访问它。

在 flex 手册页中我看到选项 --header-file=lex.h 似乎类似于 yacc 的 -d,但是当我使用它时出现错误:

lex: can not open --header-file=lex.h
/usr/bin/m4:stdin:2837: ERROR: end of file in string

那么如何在我的程序中访问 yyin,或者是否有更简单的方法来调用解析器?

编辑:

我试图将 extern FILE * yyin; 放在 .l 文件的顶部,但它不起作用。

编辑 2:
当我将它添加到 C 文件中时它起作用了。

编辑 3:
我的flex版本是2.5.39,我使用的命令行是:
lex carnet.l --header-file=lex.h

最简单的解决方案是在需要使用它的文件中声明它:

extern FILE* yyin;

要使 --header 选项生效,您需要将其放在源文件名之前:

flex --header-file=lex.h carnet.l

因为虽然 flex 实现了长选项,但它不符合 GNU 风格,其中选项可能出现在位置参数之后。