抽象语法树

AST抽象语法树 Javascript版

妖精的绣舞 提交于 2019-12-05 16:48:30
在javascript世界中,你可以认为抽象语法树(AST)是最底层。 再往下,就是关于转换和编译的“黑魔法”领域了。 现在,我们拆解一个简单的add函数 function add(a, b) { return a + b } 首先,我们拿到的这个语法块,是一个FunctionDeclaration(函数定义)对象。 用力拆开,它成了三块: 一个id,就是它的名字,即add 两个params,就是它的参数,即[a, b] 一块body,也就是大括号内的一堆东西 add没办法继续拆下去了,它是一个最基础Identifier(标志)对象,用来作为函数的唯一标志。 { name: 'add' type: 'identifier' ... } params继续拆下去,其实是两个Identifier组成的数组。之后也没办法拆下去了。 [ { name: 'a' type: 'identifier' ... }, { name: 'b' type: 'identifier' ... } ] 接下来,我们继续拆开body 我们发现,body其实是一个BlockStatement(块状域)对象,用来表示是 {return a + b} 打开Blockstatement,里面藏着一个ReturnStatement(Return域)对象,用来表示 return a + b

Clang之语法抽象语法树AST

落爺英雄遲暮 提交于 2019-11-28 17:52:58
语法分析器的任务是确定某个单词流是否能够与源语言的语法适配,即设定一个称之为上下文无关语言(context-free language)的语言集合,语法分析器建立一颗与(词法分析出的)输入单词流对应的正确语法树。语法分析树的建立过程主要有两种方法:自顶向下语法分析法和自底向上分析法。AST作为语法分析树(parse tree)的一种简写方式,它独立于具体编程语言(C++、Java、C等),而且与语法分析树的建立过程无关(自顶向下和自底向上逻辑等价),是联系编译器前端、后端的重要接口。Clang的AST树与其他一些AST有些区别,如前者括号表达式为未裁剪模式(in an unreduced form),后者一般会尽量省去多余的括号,这样方便建立重构工具(clang\docs\IntroductionToTheClangAST.rst中说明)。 一、AST的直观印象 可以使用clang –emit-ast input.cpp生成AST的二进制文件input.ast,也可以直接打印输出如下: clang -Xclang -ast-dump -fsyntax-only input.cpp TranslationUnitDecl 0x5db3130 <<invalid sloc>> <invalid sloc> |-TypedefDecl 0x5db3670 <<invalid sloc>>

AST抽象语法树

瘦欲@ 提交于 2019-11-28 17:52:28
抽象语法树简介 (一)简介 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,这所以说是抽象的,是因为抽象语法树并不会表示出真实语法出现的每一个细节,比如说,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现。抽象语法树并不依赖于源语言的语法,也就是说语法分析阶段所采用的上下文无文文法,因为在写文法时,经常会对文法进行等价的转换(消除左递归,回溯,二义性等),这样会给文法分析引入一些多余的成分,对后续阶段造成不利影响,甚至会使合个阶段变得混乱。因些,很多编译器经常要独立地构造语法分析树,为前端,后端建立一个清晰的接口。 抽象语法树在很多领域有广泛的应用,比如浏览器,智能编辑器,编译器。 (二)抽象语法树实例 (1)四则运算表达式 表达式: 1+3*(4-1)+2 抽象语法树为: (2)xml 代码2.1: < letter > < address > < city > ShiChuang < / city > < / address > < people > < id > 12478 < / id > < name > Nosic < / name > < / people > < / letter > 抽象语法树 (3)程序1 代码2.2 while b ! = 0 { if a > b a =

AST 抽象语法树

点点圈 提交于 2019-11-28 17:52:15
提起 AST 抽象语法树,大家可能并不感冒。但是提到它的使用场景,也许会让你大吃一惊。原来它一直在你左右与你相伴,而你却不知。 一、什么是抽象语法树 在计算机科学中,抽象语法树( abstract syntax tree 或者缩写为 AST ),或者语法树( syntax tree ),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。 之所以说语法是「抽象」的,是因为这里的语法并不会表示出真实语法中出现的每个细节。 二、使用场景 JS 反编译,语法解析 Babel 编译 ES6 语法 代码高亮 关键字匹配 作用域判断 代码压缩 三、AST Explorer 我们来看一个 ES6 的解释器,声明如下的代码: 1 let tips = [ 2 "Jartto's AST Demo" 3 ]; 看看是如何解析的, JSON 格式如下: 1 { 2 "type": "Program", 3 "start": 0, 4 "end": 38, 5 "body": [ 6 { 7 "type": "VariableDeclaration", 8 "start": 0, 9 "end": 37, 10 "declarations": [ 11 { 12 "type": "VariableDeclarator", 13 "start": 4,

抽象语法树(AST)

假装没事ソ 提交于 2019-11-28 17:52:00
AST描述   在计算机科学中,抽象语法树(AST)或语法树是用编程语言编写的源代码的抽象语法结构的树表示。树的每个节点表示在源代码中出现的构造。语法是“抽象的”,因为它不代表真实语法中出现的每个细节,而只是结构,内容相关的细节。例如,分组括号 在树结构中是隐式的,并且可以通过具有三个分支的单个节点来表示类似于if-condition-then表达式的句法结构。   这将抽象语法树与传统上指定的解析树区分开来,这些语法树通常由解析器在源代码转换和编译过程中构建。一旦构建,通过后续处理(例如,上下文分析)将附加信息添加到AST 。   抽象语法树也用于程序分析和程序转换系统。   参考:[维基百科]( https://en.wikipedia.org/wiki/Abstract_syntax_tree ) 解析器Parser   JavaScript Parser是把js源码转化为抽象语法树的解析器,一般分为词法分析、语法分析及代码生成或执行。 词法分析   词法分析阶段会把字符串形式的代码转换为令牌(Tokens)流。可将令牌看作是一个扁平的语法片段数组。 var answer = 6 * 7; //Tokens [ { "type": "Keyword", "value": "var", "range": [ 34, 37 ], "loc": { "start": { "line

AST抽象语法树 Javascript版

空扰寡人 提交于 2019-11-26 12:08:37
在javascript世界中,你可以认为抽象语法树(AST)是最底层。 再往下,就是关于转换和编译的“黑魔法”领域了。 现在,我们拆解一个简单的add函数 function add(a, b) { return a + b } 首先,我们拿到的这个语法块,是一个FunctionDeclaration(函数定义)对象。 用力拆开,它成了三块: 一个id,就是它的名字,即add 两个params,就是它的参数,即[a, b] 一块body,也就是大括号内的一堆东西 add没办法继续拆下去了,它是一个最基础Identifier(标志)对象,用来作为函数的唯一标志。 { name: 'add' type: 'identifier' ... } params继续拆下去,其实是两个Identifier组成的数组。之后也没办法拆下去了。 [ { name: 'a' type: 'identifier' ... }, { name: 'b' type: 'identifier' ... } ] 接下来,我们继续拆开body 我们发现,body其实是一个BlockStatement(块状域)对象,用来表示是 {return a + b} 打开Blockstatement,里面藏着一个ReturnStatement(Return域)对象,用来表示 return a + b