⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 priority_down_up.java

📁 这是简单优先文法分析的全部源代码 fejgdmuhf军宣队复活
💻 JAVA
字号:
package compiler;
import javax.swing.JOptionPane;
import java.util.*;
public class Priority_down_up {

	public static void main(String[] args) {
		
		String strn=JOptionPane.showInputDialog(null, "输入文法必须是简单文法!\n请输入文法的个数", "Priority_down_up Input", 
				JOptionPane.QUESTION_MESSAGE);
		String Item=JOptionPane.showInputDialog(null,"请输入识别符号,必须为非终结符号(大写字母):","Priority_down_up Input",
				JOptionPane.QUESTION_MESSAGE);
		int n=Integer.parseInt(strn);
		
		 //产生式中有多个右部,分析句子时不便于查找,因此创建哈希表存放每个右部与左部的对应关系
		 Hashtable<String,String> Product=new Hashtable<String,String>();
		
		//初始化存放文法左部的栈&存放右部的栈
		Stack<String> leftS=new Stack<String>();
		Stack<String> rightS=new Stack<String>();
		for(int i=0;i<n;i++){
			String strleft=JOptionPane.showInputDialog(null,"请输入第"+i+"条产生式"+"\n左部:",
					"Priority_down_up Input",JOptionPane.QUESTION_MESSAGE);
			
			if(!(strleft.charAt(0)<='Z'&&strleft.charAt(0)>='A')){
				JOptionPane.showMessageDialog(null,"规则左部必须为非终结符号(大写字母),请重新输入。");
				break;
				}
			else leftS.push(strleft);
			
			String strright=JOptionPane.showInputDialog(null,"右部,如果有多个请用'|'号隔开:\n",
					"Priority_down_up Input",JOptionPane.QUESTION_MESSAGE);
			rightS.push(strright);
			
			//将每个右部与左部的对应关系存入哈希表Product中,
			StringTokenizer token=new StringTokenizer(strright,"|");
			if(token.countTokens()==1){Product.put(rightS.elementAt(i), leftS.elementAt(i));}
			else{
				String[]str=new String[token.countTokens()];
				for(int j=0;j<str.length;j++){
					while(token.hasMoreTokens()){
					str[j]=token.nextToken();
					Product.put(str[j], leftS.elementAt(i));
				    }
				}
			}
			
		}
		
		//输出确定用户输入产生式
		String s="";
		for(int i=0;i<n;i++){
			s+=leftS.get(i)+"::="+rightS.get(i)+"\n";
		}
		
		String symbol1="";
		for(int j=0;j<n;j++){
			symbol1+=leftS.elementAt(j);
		}

		String symbol2="";
		for(int j=0;j<n;j++){
			for(int k=0;k<rightS.get(j).length();k++){
				if((rightS.get(j).charAt(k)<='Z'&&rightS.get(j).charAt(k)>='A')||rightS.get(j).charAt(k)=='|')continue;
				else symbol2+=String.valueOf(rightS.get(j).charAt(k));
				}
		}
		String symbol=symbol1.concat(symbol2);
		JOptionPane.showMessageDialog(null,"您输入的产生式为: \n"+s+"该文法的所有符号次序为:"+symbol);
	
		//把栈里的数据存入字符串数组
		String left="";
		String[] right=new String[n];
		for(int i=0;i<n;i++){
			left+=leftS.elementAt(i);
		}

		for(int j=0;j<n;j++){
			right[j]=rightS.elementAt(j);
		}

		//创建简单优先关系矩阵对象
		SimplePriorityRelation PriorityMatrix=new SimplePriorityRelation();

		int[][]equal=PriorityMatrix.Equal(symbol, left, right);

		String out="分析表\n"+"------------------------------------------\n"+"  等于关系\n";
		for(int i=0;i<symbol.length();i++){
			out+="      "+symbol.substring(i, i+1)+"   ";
		}
		out+="\n";
		for(int i=0;i<symbol.length();i++){
			out+=symbol.substring(i, i+1);
			for(int j=0;j<symbol.length();j++){
				out+="    "+equal[i][j]+"    ";
			}
			out+="\n";
		}
		int[][]larger=PriorityMatrix.Great(symbol, left, right);
		out+="------------------------------------------\n"+"  大于关系\n";
		for(int i=0;i<symbol.length();i++){
			out+="      "+symbol.substring(i, i+1)+"   ";
		}
		out+="\n";
		for(int i=0;i<symbol.length();i++){
			out+=symbol.substring(i, i+1);
			for(int j=0;j<symbol.length();j++){
				out+="    "+larger[i][j]+"    ";
			}
			out+="\n";
		}
		int[][]smaller=PriorityMatrix.Little(symbol, left, right);
		out+="------------------------------------------\n"+"  小于关系\n";
		for(int i=0;i<symbol.length();i++){
			out+="      "+symbol.substring(i, i+1)+"   ";
		}
		out+="\n";
		for(int i=0;i<symbol.length();i++){
			out+=symbol.substring(i, i+1);
			for(int j=0;j<symbol.length();j++){
				out+="    "+smaller[i][j]+"    ";
			}
			out+="\n";
		}
		JOptionPane.showMessageDialog(null,out);
		
		//简单优先关系矩阵
		Hashtable<String,String> analysisTab=new Hashtable<String,String>();
		HashTable analysisTable=new HashTable();
		analysisTable.AnalysisTab(analysisTab,symbol, left, right);
		
            //分析栈
			Stack<String> stackAnalysis=new Stack<String>();
			
		   //输入串栈
			Stack<String> stackLeft=new Stack<String>();	
			
			//步骤计数器
			int iCount=0;
			
			String lefts="";
			String rights="";
			String strValue=JOptionPane.showInputDialog(null, "输入待分析字符串:", "简单优先文法", JOptionPane.INFORMATION_MESSAGE);

			//初始化分析栈&输入串
			stackAnalysis.push("#");
			System.out.println("分析栈内的字符串为 "+stackAnalysis.toString()+"\n");
			strValue+="#";
			
			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()){
				lefts=String.valueOf(stackAnalysis.peek());
				
				rights=String.valueOf(stackLeft.peek());
				
				iCount++;
				 
				 if(lefts.equals(Item)&&rights.equals("#")){
					 System.out.println(iCount + "\t" + stackAnalysis.toString() + lefts  + "\t" +"OK"+"\t"
								+rights+ stackLeft.toString() + "\t");
					 break;
				 }

			  if(analysisTab.get(lefts+rights).equals("<")||analysisTab.get(lefts+rights).equals("=")){
				  System.out.println(iCount + "\t" + stackAnalysis.toString() + lefts  + "\t" +analysisTab.get(lefts+rights)+
								"\t"+rights+ stackLeft.toString() + "\t");
				  stackLeft.pop();
				  stackAnalysis.push(rights);
			  }                                         
			  else if(analysisTab.get(lefts+rights).equals(">")){
				  out=iCount + "\t" + stackAnalysis.toString() + lefts  + "\t\t" +analysisTab.get(lefts+rights)+"\t"+
							rights+ stackLeft.toString() + "\t";
				  
	              int i=stackAnalysis.size()-1;
	              int k=i;
	              StringBuffer sb=new StringBuffer();
	             while(k>0){
	            	 k--;
	            	  if(analysisTab.get(stackAnalysis.elementAt(k)+stackAnalysis.elementAt(k+1)).equals("<")){
	            		 // k--;
	            		  for(int j=k;j<i;j++){
	            		  sb.append(stackAnalysis.pop());
	            		  }
	            		  sb.reverse();
	            		 out+=Product.get(sb.toString())+" ::= "+sb.toString();
	            		  stackAnalysis.push(Product.get(sb.toString()));
	            		  break;
	            	  }
	            	  //else k--;
	            	  }
	             System.out.println(out);
			 }
			else System.out.println("error!");
			}
	}
}

	






		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -