Parsing 以$1、$2.表示的值。。变量总是空的

Parsing 以$1、$2.表示的值。。变量总是空的,parsing,types,tree,bison,flex-lexer,Parsing,Types,Tree,Bison,Flex Lexer,我正试图在我的Ubuntu操作系统上创建一个带有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

我正试图在我的Ubuntu操作系统上创建一个带有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); }
    ;

...
%{
..
#包括“sql.h”
..
%}
%联轴节
{
结构树*t;
结构yword b;
...
}
%令牌名
%%
...
表:
名称{add_表(根,$1.v);}
;
...
问题是,无论我给它什么字符串,在解决这个问题时,v总是有值(NULL,0),即使输入字符串应该有一些表名。(我选择跳过不必要的其他细节/片段,但如果有助于解决此问题,可以提供更多。)

我写的语法是完整和正确的,但由于这个问题,我无法让它构建解析树


如有任何意见,将不胜感激

您的问题似乎与词法分析器中的某些缺失或错误代码有关

首先检查词法分析器。

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

main() {
   int token;
   while( token = yylex() ) {
      switch( token) {
         case NAME:
            printf("name '%s'\n", yylval.b.v.val );
            break;
         ...
      }
   }
}
如果您运行了一些输入,但这不起作用

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

如果在flex中有如下模式:

[a-z]+  { return NAME; }
这是不正确的,您必须这样设置值

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

我删除了AdobeFlex作为标记并添加了gnu-Flex。您的Flex定义如何?它们是否正确映射到所需的令牌?是否在扫描仪中设置yylval的值以保存适当的值?