2012-10-10 65 views
1

我想在一個名爲'mismatches'的變量中保留一個錯誤計數,其中我聲明瞭野牛文件的第一部分。如何在野牛語法中使用聲明的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; 

} 

我應該怎麼做,以便變異的'不匹配'可以用在野牛文件的所有部分?

+4

它已經是。查看生成的文件,將'%{'和'%}'之間的完整塊原樣複製到生成的文件中,並且它應該早於生成的文件(否則,包含頭文件可能會出現問題)。 –

+0

的確我在那裏看到它。從我所看到的,它應該按照預期工作。但是它的值是0.即使我沒有給它賦值,只是'int不匹配',並且嘗試cout <<不匹配;在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

如果你想數語法錯誤,一個明顯的地方插入你計數器更新的yyerror。

此外,你應該使用

%{ 
int counter; 
%} 

只要你有文件,包括你的頭,你會得到「反」的多個副本。如果從另一個文件中顯示「計數器」,那麼您顯示0並不奇怪,因爲您顯示另一個變量命名的計數器。

只要你使用野牛(和最近不夠),你寧願做這樣的事情:

%code provides 
{ 
    extern int counter; 

} 
%code 
{ 
    int counter; 
} 

或者,使用%{...%}宣佈它(即與extern),並將其定義(即,沒有extern第二%%