Jay*_*Jay 4 tree parsing types 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;
...
};
Run Code Online (Sandbox Code Playgroud)
sql1.y
%{
..
#include "sql.h"
..
%}
%union yystype
{
struct tree *t;
struct yword b;
...
}
%token <b> NAME
%%
...
table:
NAME { add_table(root, $1.v); }
;
...
Run Code Online (Sandbox Code Playgroud)
麻烦的是,无论我给它什么字符串,当解决这个问题时,即使输入字符串应该有一些表名,v总是有值(NULL,0).(我选择跳过不必要的其他细节/片段,但如果它有助于解决此问题,可以提供更多.)
我编写了完整而正确的语法,但由于这个问题我无法建立解析树.
任何输入都将非常感激.
你的麻烦似乎与词法分析器中的一些丢失或繁琐的代码有关.
首先检查你的词法分析器.
如果它没有返回令牌,则解析器部分无法正确处理值.编写一个打印令牌值的基本测试.不要介意"c"风格,首先是原则:
main() {
int token;
while( token = yylex() ) {
switch( token) {
case NAME:
printf("name '%s'\n", yylval.b.v.val );
break;
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果你运行一些输入,那不起作用.
如果词法分析器在返回NAME时没有设置yylval,则val为空是正常的.
如果在你的flex中你有一个模式,如:
[a-z]+ { return NAME; }
Run Code Online (Sandbox Code Playgroud)
你必须设置这样的值是不正确的
[a-z]+ {
yylval.val = strdup(yytext);
yylval.length = yylen;
return NAME; }
Run Code Online (Sandbox Code Playgroud)