編譯原理-遞歸下降分析法
阿新 • • 發佈:2018-02-03
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(); } }
編譯原理-遞歸下降分析法