【对于主动学习某种新知识的新手来说,如果所选知识载体内的教学案例存在各种小意外,以至于不能够达到书上所述的目标,也许这位新手很快就放弃学习相应知识。——沃兹基硕德】
原来虽然知道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;
}
//后面不变
转载请注明出处,否则不太好哇?
网友评论