atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结
1. 建立AST 抽象语法树 Abstract Syntax Tree,AST) 1
2. 建立AST 语法树----递归下降(recursive descent)法 2
3. 语法分析概念 2
3.1. 上下文无关语言,非终结符(nonterminal symbol)...
分类:
其他好文 时间:
2014-12-01 22:31:25
阅读次数:
430
如果对'a + 3 * b'进行解释,当中a=2,b=5代码非常easy,就不再进行具体的解释了。Num = lambda env, n: nVar = lambda env, x: env[x]Add = lambda env, a, b:_eval(env, a) + _eval(env, b)...
分类:
编程语言 时间:
2014-10-06 15:02:30
阅读次数:
196
假设对'a + 3 * b'进行解释,其中a=2,b=5
代码很简单,就不再进行详细的解释了。
Num = lambda env, n: n
Var = lambda env, x: env[x]
Add = lambda env, a, b:_eval(env, a) + _eval(env, b)
Mul = lambda env, a, b:_eval(env, a) * _eval(e...
分类:
编程语言 时间:
2014-10-04 12:29:06
阅读次数:
519
定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
适用地:当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。像正则表达式、浏览器应...
分类:
其他好文 时间:
2014-07-27 11:25:22
阅读次数:
198
定义
给定一个语言, 定于它的文法,并定义一个解释器,这个解释器使用改表示来解释语言中的句子。
类型
行为型模式
案例
像非常熟知的正则表达式就是描述字符串模式的一种标准语言,它为每一个模式都构造了一个特定的算法。
AbstractExpression - 一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享...
分类:
其他好文 时间:
2014-07-16 14:32:56
阅读次数:
288
抽象语法树(Abstract Syntax Tree)
抽象语法树(AST)表示组成程序的结构,可以让程序员更容易使用,F# 适宜这种开发的一个原因就是它的联合类型。这种类型非常适合表示语言,因为它可以用来表示相关而结构不相同的项目。下面就是抽象语法树的例子:
type Ast =
| Ident of string
| Val of System.Double...
分类:
其他好文 时间:
2014-06-20 11:33:28
阅读次数:
200
为算术语言(Arithmetic-Language)实现编译器和解释器
到目前,我们更注重的是语言本身的设计,即前端,没有涉及语言的编译器或解释器的实现,即后端。在这一节,我们将关注后端的实现,由抽象语法树(Abstract Syntax Tree,AST)定义的一种简单的算术语言。第一小节所展示的抽象语法树是基于联合类型的。
在下一章“解析文本”,我们还要回到这个示例,来构建这种语言的...
分类:
其他好文 时间:
2014-06-20 10:48:39
阅读次数:
203
解释抽象语法树
创建了抽象语法树之后,有两个选择:解释或编译。解释,简单地说,就是遍历树,同时执行操作;编译,就是改变成其他形式,对于机器执行来说可能更简单,通常可能更快。这一小节先讨论如何解释结果,下面一小节再讨论编译的内容,最后,再讨论何时应该用解释,何时应该用编译的问题。
下面的例子是一个很小解释器,解释抽象语法树的主要工作由函数interpret 完成,它遍历树,并同时执行需要的...
分类:
其他好文 时间:
2014-06-20 09:58:50
阅读次数:
240
编译抽象语法树
对大多数开发人员来说,编译就意谓着产生本地代码,给人感觉就是一个字,难。但是,并不一定要产生本地代码,对于 DSL,通常产生其他更加通用的编程语言。.NET 框架提供几个把抽象语法树编译成程序的功能。
技术的选择取决于几个因素。例如,如果语言针对的是开发人员,那么,生成文本文件就足够了,内容可以是 F#,也可以是其他语言,或者是编译过的程序集,能在程序中使用;然而,如果针...
分类:
其他好文 时间:
2014-06-08 14:43:58
阅读次数:
213
首先,如果从AST(抽象语法树)的角度来看,两者的AST是一模一样的,最终结果都是一次函数调用。因此,就解析器产生的结果论而言,两者是没有区别的。其次
,从作用上看,前文已经说了,两者的作用都是创建一个函数并调用之。那么为什么要创建一个函数并立即调用呢,我想大多数是因为javascript的代码默认...
分类:
编程语言 时间:
2014-05-07 10:44:18
阅读次数:
396