我正在尝试写一种类似Forth的语言。二级声明效果很好,但我很难使用它。 虽然在“官方”Forth secondary是基元的地址列表,但在我的方法中,辅助是一堆调用,而不仅是地址。例如内存中声明的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, ??? ); }
我的词法解析器解决了SECONDARY语句的虚拟歧义。由于解析器将MYFUCTION识别为“在运行中”声明的符号表中的辅助,并且提供正确的地址,因此操作符代码按顺序传递为SECONDARY。
但是如何将此参数传递给stmt声明中使用的opr()函数?
也许我应该修改我的nodeType,但我会避免它。 有没有解决方法的想法如何通过该地址?
答案 0 :(得分:1)
词法分析器识别令牌SECONDARY
并需要返回一些供解析器使用的东西(MYFUNCTION
的地址?) - 它应该将它存储到yylval
中,然后解析器可以使用$1
来获取它。您可能需要在解析器中使用适当的%token<type> SECONDARY
声明才能使其正常工作。
所有这些的详细信息在很大程度上取决于您使用的数据结构的细节(您没有描述)和您的%union
声明。