2014-01-05 1 views
1

저는 bison C++ 파서에서 작업하고 있습니다. 대부분의 예제에는 .y 파일에 location& 매개 변수가있는 오류 메서드가 있지만이 메서드를 호출하는 location_type을 얻는 방법을 모르겠습니다. 를 컴파일 할 때 처리 위치 정보 bison C++ 구문 분석기 오류

typedef location location_type; 
void 
yy::c_parser::error (const location_type& l, 
          const std::string& m) 
{ 
    driver.error (l, m); 
} 

는, 그러나

if (!driver.calc.existsVariable(*$1)) { 
      error(yyloc, std::string("Unknown variable \"") + *$1 + "\""); 

http://panthema.net/2007/flex-bison-cpp-example/에서 예를 발췌 한 것입니다, 나는 parser.yy:109: error: ‘yyloc’ was not declared in this scope 있다는 오류가 발생했습니다.

+0

[SO/how-does-flex-support-bison-location-exactly]과 관련이있을 수 있습니다. (http://stackoverflow.com/questions/656703/how-does-flex-support-bison-location-exactly) – Jarod42

답변

1

약간의 질문이 있습니다. yyerror 어디에서 전화를 원하십니까? 현재를 나타 내기 위해이 사용되는 변수를 다음 스캐너에서 전화를 사용하려면

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

: 당신이 파서에서 호출 할 경우

후 바로 @n 의사 변수를 사용 위치는 아마도 yylloc입니다.

다른 곳에서 전화를 걸려면 (예 : AST 순회에서 이상하지만 이상한 곳) 전화를 걸려면 위치를 찾으십시오.

하지만 더 중요한 것은 (미안 해요, 난 당신이 이미 알고있는 무언가를 명시 할 수있다) : 당신은 그것을을 제공하기 위해, 그 파서가 오류를 발생 할 수 있습니다 : 당신이 일반적으로 yyerror를 호출 할 필요가 없다는 것을 유의하십시오. yyerror에 대한 일반적인 호출은 생성 된 코드에 있으며 사용자가 작성해야하는 코드에는 포함되어 있지 않습니다.

+0

그것은 @n입니다. 감사! – prosseek