gpt4 book ai didi

c# - 如何执行我正在编写的语言?

转载 作者:行者123 更新时间:2023-11-30 13:36:26 25 4
gpt4 key购买 nike

我正在使用 C# 编写自己的编程语言只是为了好玩。它被称为声压级。它只有 12 个关键字/命令/说明,仅此而已。我确切地知道每个命令要做什么。这是类图:

enter image description here

当然这还没有结束。但想法是,我们有一个运行时 ISplRuntime。命令所做的所有事情都是在运行时完成的。例如,OutputCommandISplRuntime.Current 中的内容(这只是一个 object)输出到 ISplRuntime.Output(这是一个 TextWriter)。

到目前为止一切顺利。但随后我需要实现 IGotoCommand,它就像 C# 中的 goto 关键字。我要制作三种goto。但是我想不出如何改变程序的流程。

这是我尝试过的想法:

ISplRuntime 中添加一个名为 RunNextCommand() 的方法。在每个命令的 Execute() 方法的末尾,调用 RunNextCommand。但是,如果用户编写大量 SPL 代码,堆栈跟踪将变得越来越大,并导致 Stack Overflow。

将委托(delegate)添加到 ISplRuntime。每次命令完成执行时,Invoke() 委托(delegate)。委托(delegate)将查找下一个要执行的命令,并对该 ICommand 调用 Execute()。但是我不确定这是否也会导致堆栈溢出。 会不会导致栈溢出?

我仍然不太确定这是否是正确的方法。我只是想要一个关于如何做这种事情的一般性答案,因为这是我第一次写语言。另外请告诉我使用委托(delegate)是否会导致堆栈溢出。

最佳答案

I am writing my own programming language using C# just for fun.

太棒了!

Add a method called RunNextCommand() in ISplRuntime. And in the end of every command's Execute() method, call RunNextCommand.

甚至在您意识到这样做会导致堆栈溢出之前,您就应该意识到您对 RunNextCommand 的描述并没有按照它在锡 jar 上所说的那样进行。您所描述的称为 RunRemainderOfProgram。这表明此设计中有问题。

Add a delegate to ISplRuntime. Each time a command has finished executing, Invoke() the delegate. The delegate will look for the next command to execute and call Execute() on that ICommand. But I am not sure if this will also result in a stack overflow. Will it result in a stack overflow?

我不明白为什么会这样。所以这里的想法是 RunNextCommand 作为它的最后一个 Action 设置一个委托(delegate),当被调用时,它执行下一个命令?

您在这里发明的称为延续。指令的延续是“接下来会发生什么?”当前执行点。

I am still not very sure if this is the right way to do it. I just want an general answer about how to do this kind of thing as this is the first time for me to write a language.

有很多方法可以构建解释器,这基本上就是您在这里所做的。我会继续试验,看看哪些有效,哪些无效。

研究这个问题在虚拟机和实际机器中是如何解决的可能会有所帮助。在那些机器中,每条指令都有一个与之关联的唯一编号; “goto”包含下一条要运行的指令的编号。有一个称为“指令指针”的特殊变量,它具有当前正在运行的指令的编号。如果当前指令是goto,则IP被设置为goto指示的值;如果不是,IP 递增到下一条指令,依此类推。然后主循环是“查找当前IP的指令,执行它,设置新IP,重复”。

Also please tell me whether using delegates will cause a stack overflow.

很难预测我们看不到且您未编写的程序的行为。尝试一下,您会很快发现自己是否编写了无界递归。

祝你好运!

关于c# - 如何执行我正在编写的语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33727113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com