1. 程式人生 > >編譯原理-遞歸下降分析法

編譯原理-遞歸下降分析法

int urn sta ret pan package 編譯 string 遞歸

題:對下列文法,用遞歸下降分析法對任意輸入的符號串進行分析:

(1)E->TG

(2)G->+TG|—TG

(3)G->ε,

(4)T->FS

(5)S->*FS|/FS

(6)S->ε

(7)F->(E)

(8)F->i

答:文法太多,可先合並。

(1)E->FSG

(2)G->+TG|—TG|ε

(3)S->*FS|/FS|ε

(4)F->(E)|i

結合1,4

(1)E->ESG|iSG

(2)G->+TG|—TG|ε

(3)S->*FS|/FS|ε

(4)F->(E)|i

消除左遞歸

(1)E->iSGE1

(2)E1->SGE1|ε

(3)G->+TG|—TG|ε

(4)S->*FS|/FS|ε

(5)F->(E)|i

好吧,其實上面的化簡有些地方並無必要,不過我的代碼是按照最後的文法寫的。

package compile;

public class com {
    public static String str="i+i*i";   //待測試語句
    
static int seri=0; //記錄當前讀到的序號 public static void main(String[] args) { int t=E(); //文法 if(t==1) { System.out.println(str+" compiled successfully"); } else { System.out.println(str+" compiled failed"); } }
static char getchar() { if(seri<str.length()) { System.out.println(seri+" "+str.charAt(seri)); return str.charAt(seri++); } return ‘ ‘; }; static int E() { char ch=getchar(); if(ch!=‘i‘) { return 0; }return S()*G()*E1(); } static int S() { char ch=getchar(); if(ch==‘+‘|ch==‘-‘) { seri--;return 1; }else if(ch==‘*‘|ch==‘/‘) { return F()*S(); }else if(ch==‘i‘) { return 0; } return 1; } static int F() { char ch=getchar(); if(ch==‘i‘) return 1; return E(); } static int G() { char ch=getchar(); if(ch==‘*‘|ch==‘/‘) { seri--;return 1; }else if(ch==‘+‘|ch==‘-‘) { return F()*S()*G(); }else if(ch==‘i‘) { return 0; } return 1; } static int E1() { char ch=getchar(); if(ch==‘i‘) return 0; if(ch==‘ ‘) return 1; return S()*G()*E1(); } }

編譯原理-遞歸下降分析法