处理位置信息bison c ++解析器错误

时间:2014-01-05 23:16:15

标签: c++ bison

我正在研究一个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错误。

1 个答案:

答案 0 :(得分:1)

你的问题有点不清楚:你想从哪里打电话给yyerror

如果你想从解析器调用它,那么只需使用@n伪变量:

exp: exp "/" exp
  {
    if (!$3)
      {
         yyerror(@3, "division by zero");
         YYERROR;
      }
    else
      {
         $$ = $1 / $3;
      }
  }

如果您想从扫描仪中调用它,请使用此处使用的变量来表示当前位置,可能类似于yylloc

如果你想从其他地方调用它(例如,从AST遍历,但这很奇怪),那么找到那里的位置。

但更重要的是(抱歉,我可能会陈述您已经知道的内容):请注意,您通常不需要致电yyerror:您必须提供它,以便解析器可能会引发错误。对yyerror的典型调用在生成的代码中,而不是在您希望编写的代码中。