2012-10-10 35 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第二%%