关于flex / C的两个快速问题

时间:2014-02-05 17:32:03

标签: c flex-lexer

我想用这个成语:

    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()只能返回一种类型,那么获得所需结果的可接受方式是什么?

感谢。

1 个答案:

答案 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将生成此声明并将其放入其生成的头文件中。)