www.pudn.com > LL1up_down.rar > LL1up_down.java


package sun; 
import java.util.*; 
 
import javax.swing.JOptionPane; 
public class LL1up_down { 
 
	/** 
	 * LL(1)文法自上而下分析,判断输入符号串是否是此文法的句子,文法与分析表已知。 
	 * 文法见书本P77例5.6,分析表见书本P79表5.1 
	 */ 
	public static void main(String[] args) { 
		 
		Hashtable analysisTab=new Hashtable(); 
		AnalysisTable analysisTable=new AnalysisTable(); 
		analysisTable.AnalysisTab(analysisTab); 
		 
            //分析栈 
			Stack stackAnalysis=new Stack(); 
			 
		   //输入串栈 
			Stack stackLeft=new Stack();	 
			 
			//步骤计数器 
			int iCount=0; 
			 
			String left=""; 
			String right=""; 
			String strat=JOptionPane.showInputDialog(null, "输入文法识别符号:", "LL(1)文法", JOptionPane.INFORMATION_MESSAGE); 
			String strValue=JOptionPane.showInputDialog(null, "输入待分析字符串:", "LL(1)文法", JOptionPane.INFORMATION_MESSAGE); 
 
			//初始化分析栈&输入串 
			stackAnalysis.push("#"); 
			stackAnalysis.push(strat); 
			System.out.println("分析栈内的字符串为 "+stackAnalysis.toString()+"\n"); 
			strValue+="#"; 
			System.out.println("文法识别符号为 "+strat+"\n"); 
			System.out.println("待分析串为 "+strValue+"\n"); 
			for(int i=strValue.length()-1 ; i>=0 ; i -- ){ 
				stackLeft.push(strValue.substring(i, i+1)); 
			} 
			System.out.println("符号栈内的字符串为 "+stackLeft.toString()+"\n"); 
			String output="分析表"; 
			output+="------------------------"; 
			System.out.println(output); 
			 
			//开始分析 
			while(!stackAnalysis.empty()&& !stackLeft.empty()){ 
				left=stackAnalysis.pop().toString(); 
				 
				right=stackLeft.pop().toString(); 
				 
				iCount++; 
				 
			  if(analysisTab.get(left+right)!=""){ 
					if(!left.equals(right)){ 
						 
						System.out.println(iCount + "\t" + stackAnalysis.toString() + left  + "\t\t" + 
								right+ stackLeft.toString() + "\t"+"寻找产生式"+"\t"+left+" ::= "+analysisTab.get(left+right)); 
						 
						for(int j=analysisTab.get(left+right).length()-1 ; j>=0 ; j--){ 
							 
							//匹配就从右向左依次入栈 
						    String strChar=analysisTab.get(left+right).substring(j,j+1); 
						     
						    if(!strChar.equals("$")) 
						    	stackAnalysis.push(strChar); 
						    }	 
						 
						//把取出的字符串仍然送回 
						stackLeft.push(right); 
						} 
					 
					else{ 
						System.out.println(iCount + "\t" + stackAnalysis.toString()+ left + "\t\t"  
							+  right+stackLeft.toString() + "\t" + "'" + left + "'匹配" ); 
						 
						if(left.equals("#")&&right.equals("#")) 
							System.out.println(++iCount + "\t" + stackAnalysis.toString() + "\t\t"  
									+ stackLeft.toString() + "\t" + "分析成功" ); 
						 
						} 
					} 
			 
			else{ 
				System.out.println(++iCount + "\t" +  stackAnalysis.toString() + left + "\t"  
							+ right+ stackLeft.toString()+ "\t" + "分析不成功" ); 
				} 
			 
} 
	} 
}