我正在尝试通过Bison 3.0(C解析器生成器),Flex 2.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
s也证明了这一点。
我做错了什么?三江源
感谢最近的答案,我可以理解这些问题与Flex及其配置文件密切相关。特别是我编辑了我的lex文件,以满足Flex Manual针对Bison Bridging所描述的规范:
{ID} { printf("[id-token]");
yylval->str_t = strdup(yytext);
return ID; }
然而,在运行Bison,然后运行Flex(提供--bison-bridge
选项)然后运行编译器之后,我执行生成的解析器并我立即得到Segmentation Fault
。
问题是什么?
答案 0 :(得分:2)
弹性选项--bison-bridge
(或%option bison-bridge
)与野牛选项%define api.pure
匹配。你需要使用BOTH bison-bridge
和api.pure
或者NEITHER - 任何一种方式都可以工作,但它们需要保持一致。由于您似乎未使用api.pure
,因此您要删除--bison-bridge
选项。
答案 1 :(得分:0)
$1
,$2
等的值必须由词法分析器设置。
如果您在标识符的词法分析器中有规则,例如
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
会分配内存。