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