您好我在C中编写rpn计算器,我将rpn表达式编译为字节码。 但是我不确定代表它们的数据结构是什么? 到目前为止,我的堆栈数据结构是
struct stack_t{
int type;
union {
double val;
char *str;
/* probably some more */
}u;
};
答案 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.val
或stk.real_.val
,而不是stk.int_.val
。 union 部分向上游移位,因此数据部分可以具有内部结构而无需额外嵌套。并且仍然可以在顶层访问tag
以确定正在使用哪个子类型。