美文网首页
《Flex与Bison中文版》填坑之旅_1#

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

作者: Aftremath_为了冰激凌 | 来源:发表于2019-09-28 22:44 被阅读0次

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

    原来虽然知道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#

          本文链接:https://www.haomeiwen.com/subject/pzynuctx.html