2014-01-05 2 views
1

Я работаю над парсером cison C++. В большинстве примеров есть метод ошибок с параметром location& в .y файле, но я не уверен, как получить метод location_type для вызова этого метода.Обработка информации о местоположении bison C++ parser error

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

Может быть связано с [SO/how-do-flex-support-bison-location-exact] (http://stackoverflow.com/questions/656703/how-does-flex-support-bison-location-exactly) – Jarod42

ответ

1

Ваш вопрос немного неясен: куда вы хотите позвонить yyerror?

Если вы хотите, чтобы вызвать его из анализатора, а затем просто использовать @n псевдопеременные:

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

Если вы хотите, чтобы вызвать его из сканера, а затем использовать переменную, используемую там для обозначения тока местоположение, вероятно, что-то вроде yylloc.

Если вы хотите вызвать его из другого места (например, из обхода AST, но это было бы странно), тогда найдите там место.

Но что еще более важно (извините, я могу констатировать то, что вы уже знаете): быть в курсе, что вы обычно не нужно вызывать yyerror: вы должны обеспечить его, так что синтаксический анализатор может вызывать ошибки. Типичные вызовы yyerror приведены в сгенерированном коде, а не в коде, который вы должны написать.

+0

Это было @n. Благодаря! – prosseek

Смежные вопросы