【问题标题】:how can carry a statement a parameter怎样才能携带一个语句一个参数
【发布时间】:2014-07-10 19:42:37
【问题描述】:

我正在尝试编写类似 Forth 的语言。二级声明效果很好,但我很难使用它。 虽然在“官方”的 Forth 中,二级是原语地址列表,但在我的方法中,二级是一堆调用,而不仅仅是地址。例如内存中声明的 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 语句的虚拟歧义由我的词法解析器解决。运算符代码按 SECONDARY 顺序传递,因为解析器将 MYFUCTION 识别为“动态”声明的符号表中的辅助代码并提供它的正确地址。

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

也许我应该修改我的 nodeType,但我会避免它。 是否有任何解决方法的想法如何传递该地址?

【问题讨论】:

    标签: bison


    【解决方案1】:

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

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

    【讨论】:

    • 这是我害怕的答案... :) 但是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2015-10-02
    • 2023-01-26
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多