Fil*_*mic 7 c++ interpreter vm-implementation
大家好,我目前正在实施一种简单的编程语言来学习,但我需要一些建议.目前我正在设计我的口译员,我遇到了一个问题.
我的语言是C的一个子集,我在堆栈解释器实现方面遇到了问题.在下面的语言中将编译:
somefunc ()
{
1 + 2;
}
main ()
{
somefunc ();
}
Run Code Online (Sandbox Code Playgroud)
现在这没关系,但是当计算"1 + 2"时,结果被推到一个堆栈然后函数返回但是堆栈上仍然有一个数字,并且不应该存在.我怎样才能解决这个问题?
我想过在函数调用之前保存堆栈的"状态"并在函数调用之后恢复"状态".例如,保存堆栈上的元素数量,然后执行函数代码,返回,然后从堆栈中弹出,直到我们拥有与之前相同数量的元素(如果函数返回了某些内容,则可能为+1).
有任何想法吗?谢谢你的任何提示!
好问题!我的一个爱好是编写玩具语言的编译器,所以感谢您的优秀编程品味.
一个表达式语句是其中该语句中的代码只是一个表达式.这意味着表单中的任何内容<expression> ;,包括赋值和函数调用等内容,但不包括ifs,whiles或returns.任何表达式语句都会在最后的堆栈上有一个剩余值,您应该丢弃它.
1 + 2 是一个表达式语句,但这些也是如此:
x = 5;
赋值表达式在堆栈上保留值5,因为赋值的结果是左操作数的值.在之后的语句完成你弹出关闭未使用的值5.
printf("hello world!\n");
printf()返回输出的字符数.您将在堆栈上保留此值,因此在语句完成时将其弹出.
实际上,每个表达式语句都会在堆栈上留下一个值,除非表达式的类型是void.在这种情况下,您可以使用特殊情况void语句,之后不会弹出任何内容,或者将假装的"void"值推送到堆栈中,这样您就可以随时弹出一个值.