package com.wang.bianyi.model;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.Vector;
import com.wang.bianyi.tool.Tools;
public class OperateData {
private Map<String,Map<String,String>> wenfa;
private String text;
private Stack stateStack;//状态栈
private Stack yuyiStack;//语义值栈
private Stack signStack;//符号栈
private Stack inputStack;//输入字符栈
private String state;
private String yuyi;
private String sign;
private String input;
private Map<String,String> wenfaMap;
private Map<String,Object> amap;
private Map<String,Map<String,Object>> analyTable;
private String message;
public String getMessage(){
return message;
}
private void setMessage(String str){
StringBuffer buffer=new StringBuffer();
buffer.append("控制台信息:\n本语义分析器文法为:\n"+"S--->E \n"+"E--->E+T \n"+"T--->T*F\n"+"T--->i \n"+"F--->i \n");
buffer.append(str);
message=buffer.toString();
}
public OperateData(String text){ //空的构造方法
this.text=text;
stateStack=new Stack();
stateStack.push("0");
yuyiStack=new Stack();
yuyiStack.push("-");
signStack=new Stack();
signStack.push("#");
inputStack=new Stack();
text=text.trim();
inputStack.push("#");
inputStack.push(text.substring(text.length()-1));
for(int i=text.length()-1;i>=1;i--){
inputStack.push(text.substring(i-1,i));
}
wenfa=new HashMap<String,Map<String,String>>();
analyTable=new HashMap<String,Map<String,Object>>();
Map<String,String> wMap0=new HashMap<String,String>();
wMap0.put("0","S");
wMap0.put("S","E");
Map<String,String> wMap1=new HashMap<String,String>();
wMap1.put("1","E");
wMap1.put("E","E+T");
Map<String,String> wMap2=new HashMap<String,String>();
wMap2.put("2","E");
wMap2.put("E","T");
Map<String,String> wMap3=new HashMap<String,String>();
wMap3.put("3","T");
wMap3.put("T","T*F");
Map<String,String> wMap4=new HashMap<String,String>();
wMap4.put("4","T");
wMap4.put("T","F");
Map<String,String> wMap5=new HashMap<String,String>();
wMap5.put("5","F");
wMap5.put("F","i");
wenfa.put("0",wMap0);
wenfa.put("1",wMap1);
wenfa.put("2",wMap2);
wenfa.put("3",wMap3);
wenfa.put("4",wMap4);
wenfa.put("5",wMap5);
Map<String,Object> amap0=new HashMap<String,Object>();
amap0.put("i","S4");
amap0.put("+",null);
amap0.put("*",null);
amap0.put("#",null);
amap0.put("E","1");
amap0.put("T","2");
amap0.put("F","3");
Map<String,Object> amap1=new HashMap<String,Object>();
amap1.put("i",null);
amap1.put("+","S5");
amap1.put("*",null);
amap1.put("#","acc");
amap1.put("E",null);
amap1.put("T",null);
amap1.put("F",null);
Map<String,Object> amap2=new HashMap<String,Object>();
amap2.put("i",null);
amap2.put("+","r2");
amap2.put("*","S6");
amap2.put("#","r2");
amap2.put("E",null);
amap2.put("T",null);
amap2.put("F",null);
Map<String,Object> amap3=new HashMap<String,Object>();
amap3.put("i",null);
amap3.put("+","r4");
amap3.put("*","r4");
amap3.put("#","r4");
amap3.put("E",null);
amap3.put("T",null);
amap3.put("F",null);
Map<String,Object> amap4=new HashMap<String,Object>();
amap4.put("i",null);
amap4.put("+","r5");
amap4.put("*","r5");
amap4.put("#","r5");
amap4.put("E",null);
amap4.put("T",null);
amap4.put("F",null);
Map<String,Object> amap5=new HashMap<String,Object>();
amap5.put("i","S4");
amap5.put("+",null);
amap5.put("*",null);
amap5.put("#",null);
amap5.put("E",null);
amap5.put("T","7");
amap5.put("F","3");
Map<String,Object> amap6=new HashMap<String,Object>();
amap6.put("i","S4");
amap6.put("+",null);
amap6.put("*",null);
amap6.put("#",null);
amap6.put("E",null);
amap6.put("T",null);
amap6.put("F","8");
Map<String,Object> amap7=new HashMap<String,Object>();
amap7.put("i",null);
amap7.put("+","r1");
amap7.put("*","S6");
amap7.put("#","r1");
amap7.put("E",null);
amap7.put("T",null);
amap7.put("F",null);
Map<String,Object> amap8=new HashMap<String,Object>();
amap8.put("i",null);
amap8.put("+","r3");
amap8.put("*","r3");
amap8.put("#","r3");
amap8.put("E",null);
amap8.put("T",null);
amap8.put("F",null);
analyTable.put("0",amap0);
analyTable.put("1",amap1);
analyTable.put("2",amap2);
analyTable.put("3",amap3);
analyTable.put("4",amap4);
analyTable.put("5",amap5);
analyTable.put("6",amap6);
analyTable.put("7",amap7);
analyTable.put("8",amap8);
}
public Vector<String> getColumnData(){ //返回JTable的列数据
Vector<String> columnNames=new Vector<String>();
columnNames.add("步骤");
columnNames.add("状态栈");
columnNames.add("语义栈(值栈)");
columnNames.add("符号栈");
columnNames.add("剩余输入串");
columnNames.add("ACTION");
columnNames.add("GOTO");
return columnNames;
}
public Vector<Vector> getRowData(){ //返回JTable的列数据
Vector<Vector> rowData=new Vector<Vector>();
String NT=""; //终结符或非终结符
String GOTO="";
Vector<String> vector;
Tools tools=new Tools();
String wenfaleft="";
String wenfaright="";
int a=0;
int b=0;
for(int i=1;true;i++){
vector=new Vector<String>();
state=(String)stateStack.lastElement();//从状态栈中栈顶元素
amap=analyTable.get(state);
input=(String)inputStack.lastElement();//获得输入串栈栈顶元素
if(input.matches("\\d")){
input="i";
}
NT=(String)amap.get(input);
if(NT==null){
vector.add(i+")"); //步骤
vector.add(tools.getStackAll(stateStack));//状态栈
System.out.println(tools.getStackAll(stateStack));
vector.add(tools.getStackAll(yuyiStack));//语义栈(值栈)
vector.add(tools.getStackAll(signStack));//符号栈
vector.add(tools.getInputStackAll(inputStack));//剩余输入串
vector.add("失败");
vector.add("");
rowData.add(vector);
setMessage("输入的字符串为:"+text+" 语法语义分析失败 !");
break;
}
if(NT.startsWith("S")){//移进
vector.add(i+")"); //步骤
vector.add(tools.getStackAll(stateStack));//状态栈
vector.add(tools.getStackAll(yuyiStack));//语义栈(值栈)
vector.add(tools.getStackAll(signStack));//符号栈
vector.add(tools.getInputStackAll(inputStack));//剩余输入串
vector.add(NT);//ACTION
vector.add("");//GOTO
stateStack.push(NT.substring(1));
String inputHead=(String)inputStack.pop();
yuyiStack.push(inputHead);
signStack.push(inputHead);
}else{
if(NT.startsWith("r")){//归约
vector.add(i+")"); //步骤
vector.add(tools.getStackAll(stateStack));//状态栈
vector.add(tools.getStackAll(yuyiStack));//语义栈(值栈)
vector.add(tools.getStackAll(signStack));//符号栈
vector.add(tools.getInputStackAll(inputStack));//剩余输入串
vector.add(NT);//ACTION
wenfaMap=wenfa.get(NT.substring(1));
wenfaleft=wenfaMap.get(NT.substring(1));
wenfaright=wenfaMap.get(wenfaleft);
for(int j=1;j<=wenfaright.length();j++){
stateStack.pop();
}
state=(String)stateStack.lastElement();
amap=analyTable.get(state);
GOTO=(String)amap.get(wenfaleft);
if