如何携带一个语句参数

时间:2014-07-10 19:42:38

标签: bison

我正在尝试写一种类似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,但我会避免它。 有没有解决方法的想法如何通过该地址?

1 个答案:

答案 0 :(得分:1)

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

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