编译原理——变量声明语句(四)

来源:互联网 发布:二维数组的定义 编辑:程序博客网 时间:2024/06/06 00:04

语法分析。

代码:

Syntax.java

package per.eyuan.compile;import per.eyuan.util.Action;import per.eyuan.util.GoTo;import per.eyuan.util.Id;import per.eyuan.util.IdTable;import per.eyuan.util.MyStack;import per.eyuan.util.TwoItem;public class Syntax {//Id idt[];//存放词法分析得到的Id数组,并添加type属性IdTable idt;TwoItem ti[];//二元式int ti_flag;//二元式当前位置标志,MyStack msStatu=new MyStack();//状态栈,存放状态MyStack msSymble=new MyStack();//符号栈,存放符号MyStack msSmtm=new MyStack();//语义栈Action act=new Action();//Action表GoTo gt=new GoTo();//GoTo表String action;//动作boolean succ=false;//是否接受,分析成功String statu="";//当前动作时的状态栈内容String symble="";//符号栈内容String state="";//语句String semanteme="";//语义String syntax[]={"S`->S","S->D;","D->int id","D->float id","D->D,id"};String synL[]={"X","S","D","D","D"};String synR[][]={{"S"},{"D",";"},{"int","id"},{"float","id"},{"D",",","id"}};String vnType;//非终结符的“类型”public Syntax() {super();init();}public void init(){//状态栈和符号栈初始化msStatu.push("0");msSymble.push("#");msSmtm.push("_");ti_flag=0;}public void analyse(){System.out.println("状态栈\t\t符号栈\t\t语义\t\t输入串\t\t\t动作说明");while(!succ){//获取状态栈和语句栈栈顶,查询Action表act.setTable(msStatu.getTop(), ti[ti_flag].getItem1());//获取Action表返回的动作,并作处理//action=act.getAction();action=act.getAction();perform(action);}}public void perform(String action){//出错if(action.equals("err")){error();}//接受else if(action.equals("acc")){this.succ=true;output(-1);}//移进//移进时,状态入栈,符号入栈,二元式“出栈”else if(action.charAt(0)=='s'){int x=Integer.parseInt(action.charAt(1)+"");output(x);//输出动作说明等msStatu.push(x+"");msSymble.push(ti[ti_flag].getItem1());if(ti[ti_flag].getItem1().equals("id"))msSmtm.push(ti[ti_flag].getItem2());//或为msSmtm.push(id[Integer.parseInt(ti[ti_flag].getItem2())].getName());elsemsSmtm.push("_");ti_flag++;//标志从0开始,逐渐增大,二元式“出栈”}//归约else if(action.charAt(0)=='r'){int y=Integer.parseInt(action.charAt(1)+"");output(y);//输出动作说明等int ind=-1;if(y==2||y==3||y==4)ind=Integer.parseInt(ti[ti_flag-1].getItem2());for(int j=0;j<synR[y].length;j++){msSymble.pop();msStatu.pop();msSmtm.pop();}msSymble.push(synL[y]);gt.setTable(msStatu.getTop(), synL[y]);msStatu.push(gt.getGoTo());msSmtm.push(synL[y]);if(y==2){addType(ind,"int");vnType="int";}else if(y==3){addType(ind,"float");vnType="float";}else if(y==4)addType(ind,vnType);}}//错误处理public void error(){System.out.println("error,语法错误");}//输出动作public void output(int num){//输出分析过程statu=symble=state=semanteme="";for(int m=0;m<msStatu.getLength();m++)statu+=(" "+msStatu.getAll()[m]);for(int m=0;m<msSymble.getLength();m++)symble+=(" "+msSymble.getAll()[m]);for(int m=0;m<msSmtm.getLength();m++)semanteme+=(" "+msSmtm.getAll()[m]);for(int m=ti_flag;m<ti.length;m++)state+=(" "+ti[m].getItem1());String actionDes=" ";//动作说明if(action.charAt(0)=='r'){//归约actionDes="用"+syntax[num]+"进行规约";}else if(action.equals("acc")){actionDes="分析成功";}else if(action.charAt(0)=='s'){//移进actionDes="状态"+num+"入状态栈";}System.out.println(statu+"\t\t"+symble+"\t\t"+semanteme+"\t\t"+state+"\t\t\t"+action+":"+actionDes);}//getters and setterspublic void setTi(TwoItem[] twoItem) {this.ti=new TwoItem[twoItem.length+1];//比词法分析得到的(有效)二元式个数多1for(int j=0;j<twoItem.length;j++)this.ti[j]=twoItem[j];this.ti[twoItem.length]=new TwoItem("#","-");}public IdTable getIdt() {return idt;}public void setIdt(IdTable idt) {this.idt = idt;}public void addType(int index,String type){idt.addType(index, type);}}

原创粉丝点击