Bison 如何将语句作为参数携带

Bison 如何将语句作为参数携带,bison,Bison,我正试着写一种类似Forth的语言。第二个声明工作得很好,但我在使用它时遇到了麻烦。 在“Official”中,第四次调用是原语地址列表,而在我的方法中,第二次调用是一组调用,而不仅仅是地址。e、 g.内存中声明的MYFUNCTION如下所示: MYFUNCTION: call primitive_foo; call primitive_bar; .... call primitive_foobar; return ; 声明如下: stmt: V

我正试着写一种类似Forth的语言。第二个声明工作得很好,但我在使用它时遇到了麻烦。 在“Official”中,第四次调用是原语地址列表,而在我的方法中,第二次调用是一组调用,而不仅仅是地址。e、 g.内存中声明的MYFUNCTION如下所示:

MYFUNCTION:
    call primitive_foo;
    call primitive_bar;
    ....
    call primitive_foobar;
    return ;
声明如下:

stmt:
    VARIABLE '=' expr                         { $$ = opr('=', 2, $3, id($1)); }
    | PORT '=' expr                           { $$ = opr('=', 2, $3, id($1)); }
 ...
 ...
    | SECONDARY                               { $$ = opr(SECONDARY, 1, ??? ); }
次要语句的虚拟歧义由我的词法分析器解决。由于解析器从声明为“动态”的符号表中将MyFunction识别为次要的,并提供它的正确地址,所以运算符代码按次要顺序传递

但如何将此参数传递给stmt声明中使用的opr()函数

也许我应该修改我的节点类型,但我会避免它。
有什么解决办法吗?如何传递该地址?

lexer识别令牌
次要
,需要返回一些东西供解析器使用(MYFUNCTION的地址
MYFUNCTION
)--它应该将其存储到
yylval
,然后解析器可以使用
$1
获取它。您可能需要在解析器中使用适当的
%tokensecondary
声明才能使其正常工作


所有这些的细节在很大程度上取决于您正在使用的数据结构(您没有描述)的细节和您的
%union
声明。

这是我害怕的答案……:)但是谢谢。