首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从Bison语法文件中检索语义值

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

Stack Overflow用户
提问于 2013-10-13 17:32:30
回答 2查看 1.2K关注 0票数 1

我试图使用Bison3.0 (C解析器生成器)、Flex2.5.35和gcc 4.4.7在CentOS 6.0上开发一个语言解析器。我有以下Bison语法文件:

代码语言:javascript
复制
%{
#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的证明。

我做错了什么?谢谢你

编辑

由于最近的回答,我可以理解这些问题与Flex及其配置文件密切相关。特别是,我编辑了我的lex文件,以满足Bison桥接的跳蚤手册描述的规范:

代码语言:javascript
复制
{ID}     { printf("[id-token]");
           yylval->str_t = strdup(yytext);
           return ID; }

但是,在运行Bison之后,然后是Flex (提供--bison-bridge选项),然后是编译器,我执行生成的解析器,我立即得到

有什么问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-13 17:56:47

$1$2等的值必须由lexer设置。

如果在lexer中有标识符的规则,如

代码语言:javascript
复制
ID       [a-z][a-z0-9]*

%%

{ID}    { return ID; }

没有设置语义值。

你必须这样做。

代码语言:javascript
复制
{ID}    {   /* Set the unions value, used by e.g. `$1` in the parser */
            yylval.str_t = strdup(yytext); 
            return ID;
        }

请记住在解析器中free值,因为strdup分配内存。

票数 0
EN

Stack Overflow用户

发布于 2013-10-13 19:37:32

flex选项--bison-bridge (或%option bison-bridge)与野牛选项%define api.pure相匹配。您需要同时使用bison-bridgeapi.pure,或者两者都不能使用--这两种方法都可以工作,但它们必须是一致的。由于您似乎没有使用api.pure,所以要删除--bison-bridge选项。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19348152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档