因為這是從開始符號出發推出句子,因此稱為自頂向下分析。
舉個例子
首先我們給定文法g如下:
s -> n v n
n -> s
| t| g
| wv -> e
| d
需要推導出句子s如下:
g d w
我們首先進行分一次隨意的推導,過程如下:
s -> n v n
-> s v n
-> s e n
-> s e t
結果明顯與句子s不符。那麼需要對其進行重新推導:
s -> n v n
-> g v n
-> g d n
-> g d w
這樣,得到的句子與需要推導出的句子s一致,那麼返回是,結束推導。
為了提高這部分的推導結果匹配的效率,我們通常會在得到乙個終結符的時候就將新得到的終結符與所需要匹配的句子裡面相應的字元進行比較,而不是讓全部的終結符都生成以後再進行全部的比較。舉個例子,就是 n v n 的第一位 n 進行推導得到了終結符後就與句子s的第一位進行匹配,如果不是相應的g就回溯,選擇下乙個 n 的推導結果。
對於該演算法的**實現如下:
tokens; // all tokens
i = 0;
stack = [s] // s 是開始符號
while(stack != )
if(stack[top] is a terminal t)
if(t == tokens[i++])
pop();
else
backtrack();
else if(stack[top] is a nonterminal t)
pop();
push(the next right hand side of t) // 逆序壓棧
比如在上乙個例子中,
tokens = [g, d, w]
stack = [s]
top = s (nonterminal)
stack = [n2, v, n1]
top = n1 (nonterminal)
stack = [n2, v, s]
top = s (terminal, 但是不匹配 tokens[0])
stack = [n2, v, t]
....
stack = [n2, v, g]
...
而就這部分而言(就所有部分),編譯器必須高效
因此,實際上我們需要線性時間的演算法
語法分析程式
語法分析程式 include include typedef struct link 字元鍊錶 link char special 10 void specialchar link charhead main while n n q charhead next while q null printf...
語法分析 自上而下分析
語法分析 是編譯過程的核心部分。它的任務是在詞法分析識別出單詞符號串的基礎上,分析並判定程式的語法結構是否符合語法規則。語言的語法結構是用上下文無關文法描述的。因此,語法分析器的工作本質上就是按文法的產生式,識別輸入符號串是否為乙個句子。這裡所說的輸入串是指由單詞符號 文法的終結符 組成的有限序列。...
LTP語法分析
詞性標註 part of speech tagging,pos 是給句子中每個詞乙個詞性類別的任務。這裡的詞性類別可能是名詞 動詞 形容詞或其他。採用863詞性標註集 tag description example a adjective 美麗 b other noun modifier 大型,西式...