Parsing 以$1、$2.表示的值。。变量总是空的
我正试图在我的Ubuntu操作系统上创建一个带有Bison(GNU Bison 2.4.1)和flex(2.5.35)的解析器。我有这样的想法: sql.h: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
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的值以保存适当的值?