无法从 Bison 语法文件中检索语义值

标签 c parsing bison flex-lexer

我正在尝试通过 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 指针,这也由我的 证明printfs.

我做错了什么?谢谢

编辑

感谢最近的回答,我可以理解这些问题与 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-bridgeapi.pure 或两者都不用——任何一种方法都可以,但它们需要保持一致。由于您似乎没有使用 api.pure,因此您想删除 --bison-bridge 选项。

关于无法从 Bison 语法文件中检索语义值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19348152/

相关文章:

c++ - 多维数组初始化

c - 这两种解决方案有什么区别?

从列表中获取值的 Pythonic 方式

python - 尝试使用 Python 解析 xml 文件并将文本数据放入字典中。 key 错误 : 0

bison - 如何解决减少减少冲突 :

c - Bison 在表达式类型之间进行转换

c - Bison - 推送和纯解析器的附加参数

c - 有什么办法可以在不增加变量的情况下解决这个数学问题吗?

c - 常用算术转换 : unexpected output

c - Ping 服务器并检查 C 程序的结果?