我想用这个成语:

    yy_scan_string(line);
    int i;
    while ((i = yylex()))
        ....

其中这两个函数是在flex生成的lex.yy.c文件中定义的。到目前为止,我是
 #including "lex.yy.c"

但它看起来很可疑。我该怎么用正确的C方式呢?
其次,我想要我的.l文件的最后一行,
.                   {   return WORD; }

不再返回“WORD”标记,而是返回其输入。例如(它是一个小的linux shell)
 ls > ls.txt

当前返回2个单词标记、一个更大的标记和6个单词标记,而我希望返回“ls”更大的“ls.txt”。当然yylex()只能返回一种类型,那么获得所需结果的可接受方式是什么?
谢谢。

最佳答案

您可以使用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将生成此声明并将其放入生成的头文件中。)

关于c - 关于flex/C的两个快速问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21584316/

10-11 23:12
查看更多