我试图使用Bison3.0 (C解析器生成器)、Flex2.5.35和gcc 4.4.7在CentOS 6.0上开发一个语言解析器。我有以下Bison语法文件:
%{
#include <stdio.h>
%}
%union {
int int_t;
char* str_t;
}
%token SEP
%token <str_t> ID
%start start
%type <int_t> plst
%%
start: plst start
| EOS { YYACCEPT; }
;
// <id> , <id> , ... , <id>
plst: ID SEP_PARAMS plst { printf("Rule 1 %s %s \n",$1,$2); }
| ID { printf("Rule 2 %s \n", $1); }
| /* empty */ { }
;
%%
int yyerror(GNode* root, const char* s) {printf("Error: %s", s);}问题所在
正如现在一样,这并不是一个真正有意义的问题,但我认为这足以理解我的问题。考虑一下,我有一个用Flex编写的扫描仪,它可以识别我的令牌。此语法文件用于识别简单的标识符列表,如:id1,id2,...,idn。我的问题是,在每个语法规则中,当我试图获取标识符的值(表示标识符相同的字符串)时,我得到了一个NULL指针,这一点也得到了printf的证明。
我做错了什么?谢谢你
编辑
由于最近的回答,我可以理解这些问题与Flex及其配置文件密切相关。特别是,我编辑了我的lex文件,以满足Bison桥接的跳蚤手册描述的规范:
{ID} { printf("[id-token]");
yylval->str_t = strdup(yytext);
return ID; }但是,在运行Bison之后,然后是Flex (提供--bison-bridge选项),然后是编译器,我执行生成的解析器,我立即得到
有什么问题吗?
发布于 2013-10-13 17:56:47
$1、$2等的值必须由lexer设置。
如果在lexer中有标识符的规则,如
ID [a-z][a-z0-9]*
%%
{ID} { return ID; }没有设置语义值。
你必须这样做。
{ID} { /* Set the unions value, used by e.g. `$1` in the parser */
yylval.str_t = strdup(yytext);
return ID;
}请记住在解析器中free值,因为strdup分配内存。
发布于 2013-10-13 19:37:32
flex选项--bison-bridge (或%option bison-bridge)与野牛选项%define api.pure相匹配。您需要同时使用bison-bridge和api.pure,或者两者都不能使用--这两种方法都可以工作,但它们必须是一致的。由于您似乎没有使用api.pure,所以要删除--bison-bridge选项。
https://stackoverflow.com/questions/19348152
复制相似问题