Parsing 结束bison解析器解析的干净方法

Parsing 结束bison解析器解析的干净方法,parsing,bison,Parsing,Bison,我正在为我工作的公司的一个项目编写一个小型表达式分析器。解析器应该检查,例如,被零除法或未定义的标识符,报告错误并停止。最好的方法是什么?假设我自己的代码没有内存泄漏,我可以简单地执行以下操作: if ($3 == 0) { yyerror("Division by zero"); return 1; } 我是否应该: if ($3 == 0) { yyerror("Division by zero"); YYERROR; } 还有第三种更好的选择吗?如果您显式调用yyerr

我正在为我工作的公司的一个项目编写一个小型表达式分析器。解析器应该检查,例如,被零除法或未定义的标识符,报告错误并停止。最好的方法是什么?假设我自己的代码没有内存泄漏,我可以简单地执行以下操作:

if ($3 == 0) {
  yyerror("Division by zero");
  return 1;
}
我是否应该:

if ($3 == 0) {
  yyerror("Division by zero");
  YYERROR;
}

还有第三种更好的选择吗?

如果您显式调用
yyerror
,那么使用
YYABORT
怎么样? 据我所知,
bison
似乎在出口处进行一些清理。
因此,
yyabt
YYERROR
将比
return 1
更可取。实际上还有第三个选项:
yyaptop

如果您试图停止解析,因为输入有效且没有错误(因为您正在使用解析器检测错误,那么这不是解析器错误,输入符合语法规则)


这将YYERROR留给语法错误(如从另一种语言接收字符串)

谢谢,这正是清除stop而不出错所需要的