用于编译后缀表达式的数据结构

时间:2010-02-21 23:02:10

标签: c

您好我在C中编写rpn计算器,我将rpn表达式编译为字节码。 但是我不确定代表它们的数据结构是什么? 到目前为止,我的堆栈数据结构是

 struct stack_t{
        int type;
        union {  
              double val;
              char *str;
              /* probably some more */
             }u;
    };

3 个答案:

答案 0 :(得分:1)

这实际上很大程度上取决于您要支持的功能集。例如,如果您的计算器支持整数(例如,整数除法),您的联盟中可能需要int

答案 1 :(得分:0)

RPN字节码的优点是它不需要存储在特殊结构中。数组/向量/列表可以。您需要一个堆栈来解释它,但是为了存储程序,您应该只将每个令牌转换为字节码指令。

至于你的联盟中的类型,它实际上取决于你的计算器的语义。为什么你想能够存储字符串?你打算使用强打字吗?

查看规范的简单RPN语言Forth

答案 2 :(得分:0)

我经历了一些后记解释器的重写,虽然我的对象结构与你的完全相同,但我最终发现这种布局“更好”,原因是我可能无法表达。我在X11事件结构中找到了这个想法。

typedef struct {
    word tag;
    word pad;
    dword padw;
} mark_;

typedef struct {
    word tag;
    word pad;
    integer val;
} int_;

typedef struct {
    word tag;
    word pad;
    real val;
} real_;

typedef struct {
    word tag;
    word sz;
    word ent;
    word off;
} comp_;

typedef union {
    word tag;

    mark_ mark_;
    int_ int_;
    real_ real_;
    comp_ comp_;
} object;

在每个结构的外部和内部都有标记可能看起来多余,但它会将所有内容保存在漂亮的小框中。它允许您更清楚地查看内存布局。

编辑:我将其称为“标记”而不是“类型”,因为它包含 t ype和fl ag


编辑:我认为更好的原因之一是它从访问表达式中删除了.u项。您需要stk.u.valstk.real_.val,而不是stk.int_.val union 部分向上游移位,因此数据部分可以具有内部结构而无需额外嵌套。并且仍然可以在顶层访问tag以确定正在使用哪个子类型。