【Static Program Analysis - Chapter 2】 代碼的表徵之抽象語法樹

抽象語法樹:AbstractSyntaxTreesphp

 

定義(wiki):html

計算機科學中,抽象語法樹abstract syntax tree或者縮寫爲AST),或者語法樹syntax tree),源代碼的抽象語法結構的狀表現形式,這裏特指編程語言源代碼。樹上的每一個節點都表示源代碼中的一種結構之因此說語法是「抽象」的,是由於這裏的語法並不會表示出真實語法中出現的每一個細節。好比,嵌套括號被隱含在樹的結構中,並無以節點的形式呈現;而相似於if-condition-then這樣的條件跳轉語句,可使用帶有兩個分支的節點來表示。express

和抽象語法樹相對的是具體語法樹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

我的理解:app

語法樹就是對程序進行語法分析的產物。編程語言

 

-------------------------------ide

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

具體語法樹(Concrete Syntax Trees,CST) vs 抽象語法樹(Abstract Syntax Trees,AST)spa

具體語法樹:

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

相關文章
相關標籤/搜索