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