《Flex与Bison中文版》填坑之旅_1#

【对于主动学习某种新知识的新手来说,如果所选知识载体内的教学案例存在各种小意外,以至于不能够达到书上所述的目标,也许这位新手很快就放弃学习相应知识。——沃兹基硕德】

原来虽然知道Flex和Bison工具的强大,但几乎不怎么用,哪怕手写scanner和parser也没有想过使用,现在准备仔细研究研究一下,但愿能坚持下去。啥书不是个看呢~

本人使用的软件环境:

  • 操作系统:Windows8.1
  • 开发IDE:CodeBlocks
  • 编译器:MingGW
  • Flex&Bison:Win_flex_bison,使用的是参考VisualStudio的生成配置(以后给出文章如何配置)。

如果你使用的Windows系统,使用的是Win_Flex工具进行生产“.l”文件,那么《Flex与Bison(中文版)》这本书中的第一个Flex程序还需要进行一些适当的补充和调整(Linux下的不知道是不是也需要这样):
1. 代码补充 yywarp()方法 或者添加 “%option noyywrap”项

/*********************File: fb1-1.l*********************/
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
[a-zA-Z]+   { words++; chars += strlen(yytext); }
\n          { chars++; lines++; }
.           { chars++; }
%%
int main(int argcm, char** argv){
    yylex();
    printf("%8d%8d%8d\n", lines, words, chars);
    return 0;
}
//补充yywrap函数,否则会报错undefined reference to `yywrap'
int yywrap(){
    return 1; //
}

或者添加“%option noyywrap”项在“%}”和“%%”之间。

%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%option noyywrap
%%
[a-zA-Z]+   { words++; chars += strlen(yytext); }
\n          { chars++; lines++; }
.           { chars++; }
%%
int main(int argcm, char** argv){
    yylex();
    printf("%8d%8d%8d\n", lines, words, chars);
    return 0;
}

那么yywrap()是干嘛的?
请参考【yywrap的解释】
ps:本人最初搜索的是来自StackOverflow的回答(不知为啥无法打开链接)。

2. Windows中使用^Z,而不是书上的^D完成输入的终止
在使用Win_flex生成c/c++文件,并对其进行编译并生成.exe后,执行程序进行数据输入。需要注意的是,输入完毕后应该输入^Z终止输入,则程序会输出结果。这个情况在书中例fb1-3的后面有说,但为啥不一开始就告诉大家?。

3. 从文件读入数据
如果希望能够从文件读入数据,那么可以增补yyin打开文件的代码:

//前面不变
int main(int argcm, char** argv){
    //yyin在Flex生成的文件中会有定义(不使用它也会定义),直接使用即可
    yyin = fopen("c:\\text_input.txt","r"); 
    yylex();
    printf("%8d%8d%8d\n", lines, words, chars);
    fclose(yyin); //这里关闭不关闭文件无所谓,但养成习惯吧~
    return 0;
}
//后面不变

转载请注明出处,否则不太好哇?

END

你可能感兴趣的:(《Flex与Bison中文版》填坑之旅_1#)