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


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

(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();        
    }    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM