2012-10-10 5 views
1

'mismatches'라는 변수에 오류 개수를 유지하려고합니다. 여기서 'bison 파일의 첫 번째 부분에 선언합니다.bison 문법 내에서 선언 된 C++ 변수를 사용하는 방법

필자의 들손 문법에서 나는 그 변수에 값을 설정했다.

그런 다음 main() 함수에서 들소 파일의 셋째 부분에서 내가 그 값을를 법원, 그리고

내 들소 파일의 매우 수정/잘라 버전 0의 :

%{ 
extern "C" FILE *yyin; 
extern int yylineno; 
extern int yynerrs; 

int yylex(); 

// Declare 'mismatches' 
int mismatches; 

%} 

%error-verbose 


%% 

expression: 
      expression ADDOP term 
      { 
        cout << "Parser is now here. Going to set `mismatches` to 6"; 
        mismatches = 6; 
      } 
      | term 
      ; 

%% 

int main() 
{   
      // Outputs 0 
      cout << mismatches; 

      yyparse(); 

      return 1; 

} 

'mismatches'변수를 bison 파일의 모든 부분에서 사용할 수 있도록하려면 어떻게해야합니까? 당신이 당신의 카운터 업데이트 yyerror 서브입니다 삽입하는 명백한 장소를 구문 오류를 계산하려면

+4

이미 있습니다. 생성 된 파일을 살펴보면,'% {'와'%}'사이의 전체 블록이 그대로 결과 파일에 복사되고 생성 된 파일의 초기 부분에 있어야합니다. 그렇지 않으면 헤더 파일을 포함하는 데 문제가있을 수 있습니다). –

+0

실제로 나는 그것을 거기에서 보았다. 그리고 내가 본 것으로부터 의도 한대로 작동해야합니다. 하지만 그 값은 0입니다. 값을 지정하지 않아도 int 불일치가 생겨 << 불일치가 발생합니다; main() 함수에서 0이라고 표시합니다 (초기화되지 않은 경고를 표시해야 할 때) – sqram

+1

전역 변수가 암시 적으로 초기화 될 때 해당 변수가 아닙니다. 예 : [여기] (http://www.cplusplus.com/forum/general/7280/)에서 Bjarne Stroutrup (C++의 작성자)의 견적을 구하십시오. –

답변

2

나는 당신이 파서를 실행 한 후 당신이 그렇게

int main() 
{   
     yyparse(); 
     cout << mismatches; 

     return 1; 
} 
+0

우연히,이 문제에 직면했다. – sqram

3

처럼, 출력 변수를 원하는 생각합니다. 당신이 당신의 헤더를 포함한 파일이 당신이 "카운터"의 많은 사본을 얻을 것이다으로 또한

, 당신은

%{ 
int counter; 
%} 

를 사용하지한다. 다른 파일에서 "카운터"를 표시하면 또 다른 변수라는 카운터가 표시되므로 0을 표시하는 것은 놀라운 일이 아닙니다.

는 오히려 이런 걸 할 거라고, 당신이 들소 (충분히 최근)를 사용하여 제공 : ((extern으로, 즉)를 선언 %{...%}를 사용, 또는

%code provides 
{ 
    extern int counter; 

} 
%code 
{ 
    int counter; 
} 

, 그리고 그것을 정의 즉, extern없이) 두 번째 %%.

관련 문제