【发布时间】:2012-02-09 00:44:40
【问题描述】:
我将如何用 C# 编写解释器,它是如何工作的?
还有关于普通解释器的任何其他信息 - 即 (Python) 以及它如何读取 if 语句、计算表达式等工作 - 甚至是伪代码将不胜感激。
【问题讨论】:
-
Lexer(source)->Parser(tokens)->抽象语法树->解释
标签: c# compilation interpreter
我将如何用 C# 编写解释器,它是如何工作的?
还有关于普通解释器的任何其他信息 - 即 (Python) 以及它如何读取 if 语句、计算表达式等工作 - 甚至是伪代码将不胜感激。
【问题讨论】:
标签: c# compilation interpreter
编写解释器不一定是一项大工作,但通常需要结构化的方法和强大的编码技能。
第一次标记化,列出代码的所有组件、字符串、关键字、运算符等。每个都占用一个插槽,例如:
这应该不会太难。
现在进行标识符分类,取决于它们在代码中的位置等。你应该能够弄清楚它们是函数调用、运算符、变量还是其他什么。
现在进行括号匹配,遍历列表,同时更新一堆不匹配的左括号,每当匹配的括号将其从堆栈中删除并链接匹配的括号,每个括号都指向另一个。
你的列表必须做成一棵树,现在你可以开始阻塞东西了,每对括号组成一个块,根据语言,其他结构可能构成一个类似括号的块。 (begin-end 语句和类似的语句可以简单地视为括号)。您只需将这样的块制作成列表中的单个元素,其中包含所有子元素的列表。此后,您为每个运算符优先级遍历树一次并为这些运算符执行阻塞。
现在您可以列出所有变量和函数,每个范围一个,并检查是否没有冲突。
为每个作用域创建一个有序的变量列表,这样你就可以建立一个内存块并准确地知道每个变量的去向。
分别用指向内存块位置和函数声明的链接替换变量和函数名。
现在您可以继续完全编译程序,或者在解释器中运行它。
要运行它,请创建一个调用堆栈列表和一个匹配的范围列表。每当一个函数被调用时,记下调用栈中的返回位置并建立一个匹配的作用域,当它完成时销毁作用域并返回到返回位置。
普通语言结构应该很容易处理,只要有if,你就知道它后面跟着两个块,如果第一个块评估为假,则跳过第二个块。类似地,循环和其他结构在您认为它们由固定数量的块组成时处理起来也很简单,其中一些简单的规则规定了何时执行它们。
我现在已经给了你结构化的方法,我不能保证实施它的技能。有无数可能的性能调整,还有很多我没有明确说明如何实现的,你必须弄清楚。
【讨论】: