【Static Program Analysis - Chapter 2】 代码的表征之抽象语法树

抽象语法树:AbstractSyntaxTrees

定义(wiki):

计算机科学中,抽象语法树abstract syntax tree或者缩写为AST),或者语法树syntax tree),源代码的抽象语法结构的状表现形式,这里特指编程语言源代码。树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if-condition-then这样的条件跳转语句,可以使用带有两个分支的节点来表示。

和抽象语法树相对的是具体语法树concrete syntax tree),通常称作分析树parse tree)。一般的,在源代码的翻译和编译过程中,语法分析器创建出分析树。一旦AST被创建出来,在后续的处理过程中,比如语义分析阶段,会添加一些信息。

An abstract syntax tree for the following code for the Euclidean algorithm:

while b ≠ 0
if a > b
a := a − b
else
b := b − a
return a

个人理解:

语法树就是对程序进行语法分析的产物。

-------------------------------

引自:https://eli.thegreenplace.net/2009/02/16/abstract-vs-concrete-syntax-trees/#id4

具体语法树(Concrete Syntax Trees,CST) vs 抽象语法树(Abstract Syntax Trees,AST)

具体语法树:

A parse tree pictorially shows how the start symbol of a grammar derives a string in the language.

return a + 2;

包含了:

additive expression

multiplicative expression

cast expression

unary expression

assignment expression

conditional expression

抽象语法树:

Abstract syntax trees, or simply syntax trees, differ from parse trees because superficial distinctions of form, unimportant for translation, do not appear in syntax trees.

return a + 2;

忽略那些对分析没有帮助的符号,标点等信息。

从CST到AST:

解析器通常直接构建AST或者是先构建CST,然后把CST转换成AST。

 int* arp[5];

这里有两个问题使得分析变得困难:
1. 通常我们都是先申明一个数组,然后再用一个指针指向这个数组。但是在CST中,指针(pointer)节点在数组之上。不易理解。
2. 数组名在叶子节点上,用起来不方便。
因为CST的这两个问题,pycparser并不通过CST去生成AST,而是直接生成AST:

int* arp[5];

在AST中,pointer节点在array节点之下,并且变量名也容易读取。

-------------------------------

如何生成抽象语法树?(以Java为例,详见http://www.cnblogs.com/XBWer/p/7256288.html

时间: 2024-08-08 09:52:32

【Static Program Analysis - Chapter 2】 代码的表征之抽象语法树的相关文章

Atitti. 语法树AST、后缀表达式、DAG、三地址代码

抽象语法树的观点认为任何复杂的语句嵌套情况都可以借助于树的形式加以描述.确实,不得不承认应用抽象语法树可以使语句翻译变得相对容易,它很好地描述了语句.表达式之间的联系.不过,由于Neo Pascal并不会显式构造抽象语法树,所以不得不借助于其他数据结构实现.根据先前的经验,栈结构就是不二之选. DAG(有向无环图) 后缀表达式:也称为逆波兰表达式,这种形式简单明晰,便于存储.在处理表达式翻译时,后缀表达式有着其他形式无法比拟的优势.不过,由于后缀表达式的应用领域比较单一,所以很少独立作为一个实际

Top 40 Static Code Analysis Tools

https://www.softwaretestinghelp.com/tools/top-40-static-code-analysis-tools/ In this article, I have summarised some of the top static code analysis tools. Can we ever imagine sitting back and manually reading each line of codes to find flaws? To eas

静态时序分析(static timing analysis)

静态时序分析(static timing analysis,STA)会检测所有可能的路径来查找设计中是否存在时序违规(timing violation).但STA只会去分析合适的时序,而不去管逻辑操作的正确性. 其实每一个设计的目的都相同,使用Design Compiler和IC Compile来得到最快的速度,最小的面积和最少的耗能.根据设计者提供的约束,这些工具会在面积,速度和耗能上做出权衡. 更深层的来看,STA一直都寻找一个问题的答案 : 在所有条件下,当时钟沿到达时,数据会正确地在每个

梦的表征、抽象的思维

梦的表征.抽象的思维 --<梦的解析>读后感 据我所知,人类最擅长的一件事就是抽象了.现在人工智能领域所做的工作,最常见的就是利用各种数学的模型解决一些现实生活中的问题.比如,我做过分析的一些东西:数据挖掘技术里面的聚类和分类.初始接触这些东西时的感觉就是玄之又玄,莫名其妙.当一步步接触之后,给我更多的是一种敬佩之情.敬佩诸如高斯一样的人物,他们是如何抽象这个世界的,他们是如何划分这个世界的.数学是人类精神文明最伟大的产物(为什么不说哲学,哲学是人类思考的根本,是宇宙的本源,我并不将其给予一个

extern 和 static和 今天的一些代码,12-03

这是关于标识符的链接属性的,链接属性只有三种:external, internal, none 改变规则: 3.1 文件作用域的变量和函数定义,即在所有 代码块和参数列表之外的标识符,使用static修饰,则具有内部链接属性.//函数声明前不能加static 3.2 一个标识符声明为extern,并且前面已经对同一个标识符进行了声明,那么 (就是把原本为none的属性改为external) ①如果前一个声明时internal或者external,那么后一个声明与前一个相同.(即尽管后一个使用了e

Java中this,static,super及finalkeyword和代码块

this: 能够使用this表示类中的属性------this.name=name 能够使用this强调调用的是本类的方法 能够使用this调用本类的构造方法------this();调用本类中无參构造方法 能够使用this表示当前对象(调用方法的对象)----最重要的用途 static: 声明属性---------属性则为全局变量 声明方法---------Person.setName("Tom");使用类名称调用static方法 final: 使用final声明的类不能有子类 使用

静态时序分析(static timing analysis) --- 时序路径

时序分析工具会找到且分析设计中的所有路径.每一个路径有一个起点(startpoint)和一个终点(endpoint).起点是设计中数据被时钟沿载入的那个时间点,而终点则是数据通过了组合逻辑被另一个时间沿载入的时间点. 路径中的起点是一个时序元件的时钟pin或者设计的input port.input port可以作为起点是因为数据可以由外部源(external source)进入设计. 终点则是时序元件的数据输入pin或者设计的output port.同理output port可以作为终点是因为数

不用一行代码和一句提示语就搞定整个表单验证。

页面效果 html: 引入 <script src="/Scripts/jquery-1.10.2.js"></script> <script src="/Scripts/Validate-1.0.1.js"></script> 1 <!DOCTYPE html> 2 3 <html xmlns="http://www.w3.org/1999/xhtml"> 4 <he

Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]

 1 2 {<HeadFirst设计模式>工厂模式之抽象工厂 } 3 { 抽象工厂的产品                       } 4 { 编译工具:Delphi7.0                  } 5 { E-Mail :[email protected]          } 6 7unit uPizzaIngredient; 8 9interface1011type12  TDough = class(TObject)13  end;1415  TThinCrustDoug