• Flex和Bison的一些笔记(一)


    用到flex和bison,总是会出现一些奇怪的问题,然后网上又查不到直接的解决办法。现在来总结一下遇到的和解决的问题。
    1. bison的C++接口
    2. flex的C++接口
    3. location的使用

    先说简单一点的,location的使用,
    在Bison手册里给出的Calculator的例子里面,使用stdin作为输入,在lex文件里定义了

    # define YY_USER_ACTION  yylloc->columns (yyleng);

    在输出位置信息的时候,行数始终是1,这个对于文件作为输入就需要做些修改了。在

    http://oreilly.com/linux/excerpts/9780596155971/error-reporting-recovery.html

    里面提到了解决办法,换一种YY_USER_ACTION的定义,

    /* handle locations */
    int yycolumn = 1;
    
    #define YY_USER_ACTION yylloc.first_line = yyloc.last_line = yylineno; \
        yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
        yycolumn += yyleng;

    但是这样定义之后,会提示yylloc不能使用.作成员运算符,没有first_line, last_line等成员,yylineno没有定义

    yylloc在flex和bison里面都会用到,yylex函数的定义,

    #define YY_DECL int \
        yylex(yy::CktParser::semantic_type* yylval, \
              yy::CktParser::location_type* yylloc)
    YY_DECL;

    在这里可以看到,yylex的参数是yylloc指针,所以上面的.运算符应该改为->。或者把YY_DECL的函数参数改为location_type& yylloc.

    但是还是出现yylloc没有first_line的错误,在网上和Bison的手册里,可以查到YYLTYPE类型,

    typedef struct YYLTYPE
    {
      int first_line;
      int first_column;
      int last_line;
      int last_column;
    } YYLTYPE;

    在flex和bison里面,还有一个和这个类型相似的定义,YYSTYPE,并且在bison生成的头文件里,可以看到

    typedef YYSTYPE semantic_type;

    但却找不到typedef YYLTYPE location_type; 而是
    typedef location location_type;但location的数据成员只有begin和end。并且在所有生成的文件里,找不到YYLTYPE。
    这样问题似乎就很奇怪了。

    当看到Position的定义时,问题就不再是问题了。Position有两个数据成员,line和column。
    所以YY_USER_ACTION定义为,

    #define YY_USER_ACTION yylloc->begin.line = yylloc->end.line = yylineno-1; \
        yylloc->begin.column = yycolumn; yylloc->end.column = yycolumn+yyleng-1; \
        yycolumn += yyleng;

    还有就是lineno的声明,在前面加上

    %option yylineno

    问题到这,似乎就应该完全解决了,但是,当做一个简单的测试的时候,却发现位置信息还是不对,行数会多一行,列数好像还在累加,
    看来yylineno的初值应该有些问题,yycolumn的累加有些问题。
    做如下的修改,

    yylloc.first_line = yyloc.last_line = yylineno - 1; // 减去初始值
    [\n] { yycolumn = 1; } // 重置为1

    直到现在,位置信息才基本正确了。

    另外两部分,有空再整理吧。

     Flex & Bison 更多的参考:

    1. http://ryan1987.blogbus.com/tag/lex/ Flex和Bison的C++解决方案 一个系列

    2. http://panthema.net/2007/flex-bison-cpp-example/ 一个很好的例子

    3. http://www.lrde.epita.fr/~akim/ccmp/doc/gnuprog2/index.html#Top 除了flex & bison, 还有其他很有用的软件的介绍,包括libstdc++和make。

  • 相关阅读:
    为什么越来越少的人用jQuery
    远程工作是一种怎样的体验?
    JavaScript黑客是这样窃取比特币的,Vue开发者不用担心!
    原有vue项目接入typescript
    ES6核心特性
    强烈推荐10个值得订阅的国外技术周报
    jquery ajax超时设置(转载)
    Multiple “order by” in LINQ(转载)
    Cookies, Claims and Authentication in ASP.NET Core(转载)
    Json.NET序列化后包含类型,保证序列化和反序列化的对象类型相同(转载)
  • 原文地址:https://www.cnblogs.com/Frandy/p/parser_flex_bison_location_using.html
Copyright © 2020-2023  润新知