Yacc问题:在下一个非终端中使数据可用

时间:2008-12-25 18:39:25

标签: c parsing yacc generator

我想在c中生成一些我在b中生成的变量:

a   :   b c { ...some code...}

一个简单的例子:

b :  X  { int result = 0; } 
  |  Y  { int result = 1; }

所以我可以,稍后再说:

c : D   { printf(result + 1); }
  | E   { printf(result + 2);  }

有没有机会这样做?真的很感激任何帮助!

2 个答案:

答案 0 :(得分:1)

result应该是一个全局变量。你可以通过包括

来做到这一点
%{
    int result;
%}

位于YACC文件的顶部。当然,您还应该分别用int result = 0int result = 1替换result = 0result = 1

答案 1 :(得分:0)

你可以像Can can那样做,但一般来说,在语法规则中使用全局变量并不是一个好主意。声明bc的类型,以便您的规则如下所示:

%union {
    int result;
};

%type <result> a b

%start a

%%

b : X {$$ = 0;} | Y {$$ = 1;} ;
c : D {$$ = 1;} | E {$$ = 2;} ;
a : b c {printf("%d", $1 + $2);};