【文章內(nèi)容簡介】
例:文法: E → TE’, E’ → +TE’| ?, T → FT’, T’ → *FT’| ?, F → (E)|i 遞歸子程序?yàn)椋? PROCEDURE E。 BEGIN T。E’ END。 PROCEDURE E’。 IF SYM=‘+’ THEN BEGIN ADVANCE。 T。E‘ END。 17 遞歸下降分析程序構(gòu)造 PROCEDURE T。 BEGIN F。T’ END。 PROCEDURE T’。 IF SYM=‘*’ THEN BEGIN ADVANCE。 F。T’ END。 PROCEDURE F。 IF SYM=‘i’ THEN ADVANCE ELSE IF SYM=‘(‘ THEN BEGIN ADVANCE。 E。 IF SYM=‘)’ THEN ADVANCE ELSE ERROR END ELSE ERROR。 18 遞歸下降分析程序構(gòu)造 ? 擴(kuò)充的巴科斯范式 – 用 {a}表示閉包運(yùn)算 a* – 用 表示 a可任意重復(fù) 0次到 n次, – 用 [a]表示 ,即 a的出現(xiàn)可有可無 ? 例如,文法 E → T|E+T, T → F|T*F, F → (E)|I 可以表示成 E → T{+T}, T → F{*F}, F → (E)|I PROCEDURE E。 BEGIN T。 WHILE SYM=‘+’ DO BEGIN ADVANCE。 T END END。 ??? 000}{ aa0}{ na01}{a19 遞歸下降分析程序構(gòu)造 PROCEDURE F。 IF SYM=‘*’ THEN ADVANCE ELSE IF SYM=‘(‘ THEN BEGIN ADVANCE。 E。 IF SYM=‘)’ THEN ADVANCE ELSE ERROR END ELSE ERROR。 PROCEDURE T。 BEGIN F。 WHILE SYM=‘*’ DO BEGIN ADVANCE。 F。 END END。 20 LL(1)分析器 ? LL(1)分析器的模型 … a + b … X Y Z . . LL(1)分析算法 LL(1)分析表 M 輸入緩沖區(qū) 分析棧 輸出 21 LL(1)分析器 ? 分析要件 –輸入緩沖區(qū):存放要分析的符號串,在串的末尾加符號 表示輸入結(jié)束。 –預(yù)測分析表:看作矩陣,存放文法中非終結(jié)符A和終結(jié)符 a的關(guān)系。矩陣元素 M[A,a] 表示 A對于輸入符號 a所采用的候選。結(jié)束標(biāo)記符 作為一個(gè)終結(jié)符號。 –棧:分析過程中,存放當(dāng)前句型中尚待分析的文法符號,包括終結(jié)符號和非終結(jié)符號。棧底用 標(biāo)記結(jié)束。初始化時(shí),把 和文法的開始符號放在棧頂。 22 LL(1)預(yù)測分析表 i + * ( ) E (1) (1) E’ (2) (3) (3) T (4) (4) T’ (6) (5) (6) (6) F (8) (7) 例: G[ E]: (1) E – TE’ (2) E’ – +TE’ (3) E’ – ? (4) T – FT’ (5) T’ – *FT’ (6) T’ –