我正在尝试通过 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 编写的扫描仪,它可以识别我的 token 。此语法文件用于识别简单的标识符列表,例如:id1,id2,...,idn
。我的问题是,在每个语法规则中,当我尝试获取标识符的值(表示标识符相同的字符串)时,我得到一个 NULL
指针,这也由我的 证明printf
s.
我做错了什么?谢谢
编辑
感谢最近的回答,我可以理解这些问题与 Flex 及其配置文件密切相关。特别是我编辑了我的 lex 文件以满足 Flex Manual 描述的规范。对于 Bison 桥接:
{ID} { printf("[id-token]");
yylval->str_t = strdup(yytext);
return ID; }
但是在运行 Bison、Flex(提供 --bison-bridge
选项)和编译器之后,我执行生成的解析器,我立即得到 Segmentation Fault
。
有什么问题?
最佳答案
flex 选项 --bison-bridge
(或 %option bison-bridge
)匹配 bison 选项 %define api.pure
。您需要同时使用 bison-bridge
和 api.pure
或两者都不用——任何一种方法都可以,但它们需要保持一致。由于您似乎没有使用 api.pure
,因此您想删除 --bison-bridge
选项。
关于无法从 Bison 语法文件中检索语义值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19348152/