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

本文关键字:简单 一个 解释器 Logo 何用 | 更新日期: 2023-09-27 18:20:09

我该如何用C#编写一个解释器,它是如何工作的?

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

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

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

首先标记化,列出代码的所有组件、字符串、关键字、运算符等。所有组件各占用一个插槽,如:

  1. 打印
  2. (
  3. "你好"世界""
  4. )

这不应该太难。

现在根据标识符在代码中的位置等进行标识符分类。您应该能够判断它们是函数调用、运算符、变量还是其他什么。

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

你的列表必须做成一棵树,现在你可以开始阻塞东西,每对括号都构成一个块,根据语言的不同,其他结构可能构成一个类似括号的块。(开始-结束语句和类似语句可以简单地像括号一样处理)。您只需将这样一个块制作成列表上的单个元素,该列表包含它的所有子元素的列表。此后,您将为每个运算符优先级遍历树一次,并为这些运算符执行阻塞操作。

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

对于每个作用域,您都会制作一个有序的变量列表,这样您就可以建立一个内存块,并准确地知道每个变量的去向。

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

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

要运行它,请制作一个调用堆栈列表和一个匹配的作用域列表。无论何时调用函数,都要注意调用堆栈中的返回位置并建立一个匹配的作用域,当调用完成时,销毁作用域并返回到返回位置。

普通语言构造应该很容易处理,只要有一个if,你就知道它后面跟着两个块,如果第一个块的值为false,就跳过第二个块。类似地,一旦您认为循环和其他构造由固定数量的块组成,并且有一些琐碎的规则规定何时执行它们中的每一个,那么它们就很难处理。


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