$ 1,$ 2 ..变量值始终为NULL

时间:2011-09-11 19:32:21

标签: parsing types tree bison flex-lexer

我正在尝试在我的Ubuntu OS上创建一个带有Bison(GNU bison 2.4.1)和flex(2.5.35)的解析器。我有这样的事情:

sql.h:

typedef struct word
{
  char *val;
  int  length;
} WORD;

struct yword
{
  struct word  v;
  int          o;
...
};

sql1.y

%{
..
#include "sql.h"
..
%}

%union yystype
{
  struct tree *t;
  struct yword b;
...
}

%token <b> NAME

%%

...

table:
        NAME           { add_table(root, $1.v); }
    ;

...

麻烦的是,无论我给它什么字符串,当解决这个问题时,即使输入字符串应该有一些表名,v总是有值(NULL,0)。 (我选择跳过不必要的其他细节/片段,但如果有助于解决此问题,可以提供更多。)

我编写的语法完整而正确,但由于这个问题我无法建立解析树。

任何输入都会非常感激。

1 个答案:

答案 0 :(得分:5)

你的麻烦似乎与词法分析器中的一些丢失或繁琐的代码有关。

首先检查您的词法分析器。

如果它没有返回令牌,则解析器部分无法正确处理值。 编写一个打印令牌值的基本测试。 不要介意“c”风格,首先是原则:

main() {
   int token;
   while( token = yylex() ) {
      switch( token) {
         case NAME:
            printf("name '%s'\n", yylval.b.v.val );
            break;
         ...
      }
   }
}

如果您运行某些输入但不起作用。

如果词法分析器在返回NAME时没有设置yylval,则val为空是正常的。

如果在你的弹性模型中你有一个模式,如:

[a-z]+  { return NAME; }

你必须像这样设置值

是不正确的
[a-z]+  { 
   yylval.val = strdup(yytext); 
   yylval.length = yylen;
   return NAME; }