【实验目的】
(1)掌握自上而下语法分析的要求与特点。
(2)掌握递归下降语法分析的基本原理和方法。
(3)掌握相应数据结构的设计方法。
【实验内容】
用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。
【实验要求】
对下列文法,用递归下降分析法对任意输入的符号串进行分析:
E->TG G->+TG|-TG G->ε
T->FS S->*FS|/FS S->ε
F->(E) F->i
【实验结果】
import java.util.Scanner; public class DiGui { int check=0; int num=0; String str=""; Scanner input=new Scanner(System.in); String key; char[] list; public void DuQu1() { System.out.println("请输入字符串并以#号结束,如:i+i*i#"); key=input.next(); list=new char[key.length()]; for(int i=0;i<key.length();i++) { list[i]=key.charAt(i); } if(list[key.length()-1]!='#') { System.out.println("没有以#结束"); error(); } if(check==0) { System.out.print("文法 "); System.out.printf("%-15s","分析串"); System.out.printf("%-16s","分析字符"); System.out.print("剩余串"); System.out.println(); E(list[num]); } } public void error() { check=1; System.out.println("error"); } public void E(char key) { if(check==0) { String str1=""; for(int i=num;i<list.length;i++) { str1=str1+list[i]; } System.out.print("E->TG "); System.out.printf("%-16s",str); System.out.printf("%-11s",list[num]); System.out.print(str1); System.out.println(); T(list[num]); G(list[num]); if(list[num]=='#') { if(check==0) { System.out.println("accept"); } } else { if(check==0) { error(); } } } } public void T(char key) { if(check==0) { String str1=""; for(int i=num;i<list.length;i++) { str1=str1+list[i]; } System.out.print("T->FS "); System.out.printf("%-16s",str); System.out.printf("%-11s",list[num]); System.out.print(str1); System.out.println(); F(list[num]); S(list[num]); } } public void G(char key) { if(check==0) { switch(list[num]) { case '+': num++; String str1=""; for(int i=num;i<list.length;i++) { str1=str1+list[i]; } str=str+"+"; System.out.print("G->+TG "); System.out.printf("%-16s",str); System.out.printf("%-11s",list[num-1]); System.out.print(str1); System.out.println(); T(list[num]); G(list[num]);break; case '-': num++; str1=""; for(int i=num;i<list.length;i++) { str1=str1+list[i]; } str=str+"-"; System.out.print("G->-TG "); System.out.printf("%-16s",str); System.out.printf("%-11s",list[num-1]); System.out.print(str1); System.out.println(); T(list[num]); G(list[num]);break; default: str1=""; for(int i=num;i<list.length;i++) { str1=str1+list[i]; } System.out.print("G->^ "); System.out.printf("%-16s",str); System.out.printf("%-11s",list[num]); System.out.print(str1); System.out.println(); break; } } } public void F(char key) { if(check==0) { switch(list[num]) { case '(': num++; String str1=""; for(int i=num;i<list.length;i++) { str1=str1+list[i]; } str=str+"("; System.out.print("F->(E) "); System.out.printf("%-16s",str); System.out.printf("%-11s",list[num-1]); System.out.print(str1); System.out.println(); E(list[num]); if(list[num]==')') { num++; str1=""; for(int i=num;i<list.length;i++) { str1=str1+list[i]; } str=str+")"; System.out.print(" "); System.out.printf("%-16s",str); System.out.printf("%-11s",list[num-1]); System.out.print(str1); System.out.println(); break; } else { error();break; } case 'i': num++; str1=""; for(int i=num;i<list.length;i++) { str1=str1+list[i]; } str=str+"i"; System.out.print("F->i "); System.out.printf("%-16s",str); System.out.printf("%-11s",list[num-1]); System.out.print(str1); System.out.println(); break; default: error();break; } } } public void S(char key) { if(check==0) { switch(list[num]) { case '*': num++; String str1=""; for(int i=num;i<list.length;i++) { str1=str1+list[i]; } str=str+"*"; System.out.print("S->*FS "); System.out.printf("%-16s",str); System.out.printf("%-11s",list[num-1]); System.out.print(str1); System.out.println(); F(list[num]); S(list[num]);break; case '/': num++; str1=""; for(int i=num;i<list.length;i++) { str1=str1+list[i]; } str=str+"/"; System.out.print("S->/FS "); System.out.printf("%-16s",str); System.out.printf("%-11s",list[num-1]); System.out.print(str1); System.out.println(); F(list[num]); S(list[num]);break; default: str1=""; for(int i=num;i<list.length;i++) { str1=str1+list[i]; } System.out.print("S->^ "); System.out.printf("%-16s",str); System.out.printf("%-11s",list[num]); System.out.print(str1); System.out.println(); break; } } } public static void main(String[] args) { DiGui digui=new DiGui(); digui.DuQu1(); } }