我正在研究一个bison c ++解析器。
大多数示例在.y文件中都有参数location&
的错误方法,但我不知道如何让location_type调用此方法。
typedef location location_type;
void
yy::c_parser::error (const location_type& l,
const std::string& m)
{
driver.error (l, m);
}
这是http://panthema.net/2007/flex-bison-cpp-example/,
的示例摘录if (!driver.calc.existsVariable(*$1)) {
error(yyloc, std::string("Unknown variable \"") + *$1 + "\"");
但是,编译时出现parser.yy:109: error: ‘yyloc’ was not declared in this scope
错误。
答案 0 :(得分:1)
你的问题有点不清楚:你想从哪里打电话给yyerror
?
如果你想从解析器调用它,那么只需使用@n
伪变量:
exp: exp "/" exp
{
if (!$3)
{
yyerror(@3, "division by zero");
YYERROR;
}
else
{
$$ = $1 / $3;
}
}
如果您想从扫描仪中调用它,请使用此处使用的变量来表示当前位置,可能类似于yylloc
。
如果你想从其他地方调用它(例如,从AST遍历,但这很奇怪),那么找到那里的位置。
但更重要的是(抱歉,我可能会陈述您已经知道的内容):请注意,您通常不需要致电yyerror
:您必须提供它,以便解析器可能会引发错误。对yyerror
的典型调用在生成的代码中,而不是在您希望编写的代码中。