Bison(yacc)如何正常退出以及返回值

之前说过如何将Bison的输入源改为指定字符串。
然而当我将输入源改为指定字符串之后,发现遇到了一个很奇怪的问题:
yyparse无论如何都会调用yyerror进行报错。
本来我准备在yyerror里进行内存的释放,这样一来,无论分析成功与否,内存都会被释放,导致分析的结果都没了。

比如如下的bison代码:

calc: expr '=' { calculate($1); }
    ;

expr: ...

每一次程序运行在成功解析,调用了calculate函数之后,都会再调用yyerror,似乎哪里出了问题。
那么怎么才能让yyparse正常返回呢?

首先这里先说明一下bison的返回值。 我看了看源码,Bison的返回值有三个:0,1,2。
0代表运行成功,正常退出;
1代表解析发生错误,语法不匹配;
2代表内存耗尽。
因此Bison似乎是不支持自定义返回值的(至少我没有找到任何资料……)。所有的返回值似乎只能从参数列表中传入。

然后我仔细研究了一下生产的C代码,发现了如下三种可以让Bison正常退出的方法:

  1. 在你想要结束的规则中直接返回。
    比如如下代码:
    calc: expr '=' { calculate($1); return 0; }
        ;
    expr: ...
    
    我一次只想分析一个表达式&#
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值