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

时间:2013-10-13 17:32:30

标签: 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编写的扫描仪来识别我的令牌。该语法文件用于识别简单的标识符列表,如: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

问题是什么?

2 个答案:

答案 0 :(得分:2)

弹性选项--bison-bridge(或%option bison-bridge)与野牛选项%define api.pure匹配。你需要使用BOTH bison-bridgeapi.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会分配内存。