【发布时间】:2015-11-16 01:11:37
【问题描述】:
我使用 C# 编写自己的编程语言只是为了好玩。它被称为 SPL。它只有 12 个关键字/命令/指令,仅此而已。我确切地知道每个命令要做什么。这是类图:
这当然还没有结束。但我们的想法是,我们有一个运行时ISplRuntime。命令所做的所有事情都是在运行时完成的。例如,OutputCommand 将ISplRuntime.Current(这只是一个object)中的内容输出到ISplRuntime.Output(这是一个TextWriter)。
到目前为止一切顺利。但是我需要实现IGotoCommand,就像C#中的goto关键字一样。我要做三种goto。但我不知道如何改变程序的流程。
这是我尝试过的想法:
在ISplRuntime 中添加一个名为RunNextCommand() 的方法。在每个命令的Execute() 方法的最后,调用RunNextCommand。但是,如果用户编写了大量的 SPL 代码,堆栈跟踪会越来越大,并导致堆栈溢出。
将委托添加到ISplRuntime。每次命令完成执行时,Invoke() 代表。代理将寻找下一个要执行的命令并在该ICommand 上调用Execute()。但我不确定这是否也会导致堆栈溢出。 会导致堆栈溢出吗?
我仍然不太确定这是否是正确的方法。我只想要一个关于如何做这种事情的一般性答案,因为这是我第一次编写语言。另外请告诉我使用委托是否会导致堆栈溢出。
【问题讨论】:
-
为什么不将goto操作插入到IL中?
-
你的程序是一个指令列表。当您执行时,您将在执行每条指令时增加指令列表的索引。 goto 将导致索引跳转,而不是仅仅增加一。
-
我会鼓励任何编写编程语言的人阅读“The Dragon Book”(en.wikipedia.org/wiki/…)。即使你不是在编写一个成熟的编译器,即使这本书是针对 C 程序员的,你也会通过阅读它学到很多东西。
标签: c# compiler-construction delegates stack-overflow