1

我正在尝试通过 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.

有什么问题?

4

2 回答 2

2

flex 选项--bison-bridge(或%option bison-bridge)与 bison 选项匹配%define api.pure。您需要使用 BOTHbison-bridgeapi.pureNEITHER - 任何一种方式都可以工作,但它们需要保持一致。由于您似乎没有使用api.pure,因此您想删除该--bison-bridge选项。

于 2013-10-13T19:37:32.670 回答
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分配内存。

于 2013-10-13T17:56:47.393 回答