7

大家好,我目前正在实施一种简单的编程语言来获得学习经验,但我需要一些建议。目前我正在设计我的口译员,我遇到了一个问题。

我的语言是 C 的子集,我在堆栈解释器实现方面遇到问题。在该语言中,将编译以下内容:

somefunc ()
{
    1 + 2;
}

main ()
{
    somefunc ();
}

现在这没关系,但是当计算“1+2”时,结果被压入堆栈,然后函数返回,但堆栈上仍然有一个数字,不应该有。我怎样才能解决这个问题?

我考虑过在函数调用之前保存堆栈的“状态”并在函数调用之后恢复“状态”。例如,保存堆栈上的元素数量,然后执行函数代码,返回,然后从堆栈中弹出,直到我们拥有与之前相同数量的元素(或者如果函数返回某些内容,则可能 +1)。

有任何想法吗?感谢您的任何提示!

4

3 回答 3

9

好问题!我的爱好之一是为玩具语言编写编译器,感谢您出色的编程品味。

表达式语句是语句中的代码只是一个表达式的语句。这意味着任何形式的<expression> ;东西,包括赋值和函数调用,但不包括ifs、whiles 或returns。任何表达式语句最后都会在堆栈上留下一个剩余值,您应该将其丢弃。

1 + 2是一个表达式语句,但这些也是:

  • x = 5;
    赋值表达式将值 5 留在堆栈上,因为赋值的结果是左侧操作数的值。语句完成后,您会弹出未使用的值 5。

  • printf("hello world!\n");
    printf() 返回输出的字符数。您将在堆栈中保留此值,因此在语句完成时将其弹出。

实际上,每个表达式语句都会在堆栈上留下一个值,除非表达式的类型是void. 在这种情况下,您要么使用特殊情况void语句并且之后不弹出任何内容,要么将假装的“void”值压入堆栈,以便您始终可以弹出一个值。

于 2010-07-21T01:53:18.623 回答
2

您将需要一个更智能的解析器。当您看到未使用其值的表达式时,您需要发出 POP。

于 2010-07-21T01:52:14.943 回答
0

这是学习优化的重要机会。您有一个执行数字但整数数学的函数,int 数学结果甚至不以任何方式、形状或形式使用。

让你的编译器优化函数会减少大量生成和执行的字节码!

于 2017-06-27T22:26:43.117 回答