我想用这个成语:
yy_scan_string(line);
int i;
while ((i = yylex()))
....
这两个函数在我的主C文件中的flex生成的lex.yy.c中定义。到目前为止,我是
#including "lex.yy.c"
但它似乎很可疑。我该怎么做正确的C方式?
其次,我想要.l文件的最后一行,
. { return WORD; }
不再返回“WORD”标记,而是返回其输入。例如(它是一个小的linux shell)
ls > ls.txt
当我希望返回“ls”GREATER“ls.txt”时,返回2个WORD标记,一个GREATER标记和6个WORD标记。当然yylex()只能返回一种类型,那么获得所需结果的可接受方式是什么?
感谢。
答案 0 :(得分:1)
您可以使用flex
命令行选项或通过在flex源中包含--header-file=<filename>
来告诉%option header-file="<filename>"
生成头文件以及C源文件。我通常使用:
flex
flex --header-file=file.h -o file.c file.l
(实际上,我使用make
规则来生成这样的命令,但这就是主意。)然后你可以在任何需要调用flex函数的源文件中#include "file.h"
。
通常,yylex
返回令牌类型(整数)。全局变量yytext
包含指向令牌字符串本身的指针,这可能足以满足您的需要。不过,请阅读flex
手册中的"A Note About yytext And Memory"。 (摘要:如果您需要保存yytext
的值,则必须复制它;建议使用strdup
。当您不再需要时,不要忘记释放副本。 )
有时,令牌字符串本身并不是您想要的语义值。按照惯例,flex
操作将令牌的语义值放在全局yylval
中,这是bison
生成的解析器将查找的位置。但是,yylval
生成的代码并未声明flex
,因此您需要自己包含一个声明,包括flex生成的代码和包含它的任何源文件。 (如果使用bison
生成解析器,bison
将生成此声明并将其放入其生成的头文件中。)