之前说过如何将Bison的输入源改为指定字符串。
然而当我将输入源改为指定字符串之后,发现遇到了一个很奇怪的问题:
yyparse无论如何都会调用yyerror进行报错。
本来我准备在yyerror里进行内存的释放,这样一来,无论分析成功与否,内存都会被释放,导致分析的结果都没了。
比如如下的bison代码:
calc: expr '=' { calculate($1); }
;
expr: ...
每一次程序运行在成功解析,调用了calculate函数之后,都会再调用yyerror,似乎哪里出了问题。
那么怎么才能让yyparse正常返回呢?
首先这里先说明一下bison的返回值。 我看了看源码,Bison的返回值有三个:0,1,2。
0代表运行成功,正常退出;
1代表解析发生错误,语法不匹配;
2代表内存耗尽。
因此Bison似乎是不支持自定义返回值的(至少我没有找到任何资料……)。所有的返回值似乎只能从参数列表中传入。
然后我仔细研究了一下生产的C代码,发现了如下三种可以让Bison正常退出的方法:
- 在你想要结束的规则中直接返回。
比如如下代码:
我一次只想分析一个表达式&#calc: expr '=' { calculate($1); return 0; } ; expr: ...