📄 priority_down_up.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 + -