如何在C#中编写一个简单的类似Logo的解释器?

时间:2012-01-12 09:25:34

标签: c# compilation interpreter

我如何在C#中编写解释器?如何工作?

关于普通解释器的任何其他信息 - 即(Python)以及它如何读取语句,计算表达式等工作 - 甚至pesudo代码都将非常感激。

1 个答案:

答案 0 :(得分:1)

编写解释器不一定是一项大工作,但它确实需要结构化的方法和强大的编码技能。

第一个标记化,列出代码的所有组成部分,sting,关键字,运算符等,每个都占用一个插槽,如:

  1. 打印
  2. “Hello \”world \“”
  3. 这不应该太难。

    现在进行标识符分类,取决于它们在代码中的位置等,你应该能够确定它们是函数调用,运算符,变量还是其他。

    现在进行括号匹配,在更新一堆不匹配的左括号时运行列表,每当一个括号匹配时将其从堆栈中删除并链接匹配的括号,使每个指针指向另一个。

    你的列表必须被制作成树,现在你可以开始阻塞东西,每对括号构成一个块,并且根据语言,其他构造可能构成一个类似括号的块。 (开头语句和类似语句可以简单地用括号表示)。这样一个块你只需要在列表中包含一个包含所有子元素列表的单个元素。此后,您将为每个运算符优先级遍历树一次,并对这些运算符执行阻塞。

    现在,您可以列出所有变量和函数,每个范围一个,并检查是否存在冲突。

    对于每个范围,您可以创建一个有序的变量列表,以便您可以建立一个内存块并准确知道每个内容的位置。

    分别用指向内存块位置和函数声明的链接替换变量和函数名称。

    现在你可以继续完全编译程序,或者在解释器中运行它。

    要运行它,请创建一个调用堆栈列表和一个匹配的范围列表。每当调用一个函数时,请记下调用堆栈中的返回位置并建立匹配的作用域,当它完成时,销毁作用域并返回到返回位置。

    正常的语言结构应该很容易处理,只要有if你知道它后跟两个块,如果第一个块的值为false,则跳过第二个。类似地,一旦你认为循环和其他结构由固定数量的块组成,并且有一些简单的规则决定何时执行它们中的每一个,循环和其他结构都很容易处理。


    我现在已经给了你结构化的方法,实现它的技巧我无法保证。有无数可能的性能调整,还有很多我没有明确告诉你如何实现,你必须要做的。