• 【Static Program Analysis


    抽象语法树:AbstractSyntaxTrees

     

    定义(wiki):

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

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

    NewImage

    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;

    NewImage

    包含了:

    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;

    NewImage 

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

     

    从CST到AST:

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

     int* arp[5];
    NewImage

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

    int* arp[5];

    NewImage

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

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

     

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

  • 相关阅读:
    linux shell获取用户输入
    yii2 笔记(1)
    yii2 数据库查询
    Yii2 环境配置生产环境和测试环境
    mysql 中find_in_set()和in()用法比较
    使用js提交form表单的两种方法
    base64编码的原理及实现
    浅析HTTP/2的多路复用
    Nginx 所使用的 epoll 模型是什么?
    git代码统计
  • 原文地址:https://www.cnblogs.com/XBWer/p/7909333.html
Copyright © 2020-2023  润新知