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 风格,其中选项可能出现在位置参数之后。
对于一个项目,我使用 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 风格,其中选项可能出现在位置参数之后。