我正在尝试通过 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
指针,我的 s 也证明了这一点printf
。
我究竟做错了什么?谢谢
编辑
感谢最近的回答,我可以理解这些问题与 Flex 及其配置文件密切相关。特别是,我编辑了我的 lex 文件,以满足Flex Manual for Bison Bridging 中描述的规范:
{ID} { printf("[id-token]");
yylval->str_t = strdup(yytext);
return ID; }
然而,在运行 Bison、Flex(提供--bison-bridge
选项)和编译器之后,我执行生成的解析器并立即得到Segmentation Fault
.
有什么问题?