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。

posted @ 2013-04-10 20:53  Frandy.CH  阅读(5555)  评论(0编辑  收藏  举报