编译原理——变量声明语句(四)
来源:互联网 发布:二维数组的定义 编辑:程序博客网 时间: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);}}
- 编译原理——变量声明语句(四)
- 编译原理——变量声明语句(一)
- 编译原理——变量声明语句(二)
- 编译原理——变量声明语句(三)
- 编译原理——变量声明语句(五)
- 编译原理——变量声明语句(六)
- 编译原理——变量声明语句(七)
- 编译原理——变量声明语句(八)
- 编译原理——变量声明语句(九)
- 编译原理——变量声明语句(十)
- 编译原理——变量声明语句(十一)
- 编译原理——变量声明语句(十二)
- 编译原理——变量声明语句(十三)
- 编译原理——变量声明语句(十四)
- 编译原理——变量声明语句(十五)
- 编译原理——赋值语句和简单表达式(四)
- python整理四——动态声明变量
- 【C++】变量(四) 变量的声明和定义
- 编译原理——变量声明语句(三)
- PB 5中PFC的使用
- Spinner的使用
- 如何使用HTML5实现拍照上传应——补充说明
- ICE的日志和统计接口
- 编译原理——变量声明语句(四)
- Android HAL
- PB中TreeView控件的深度优化搜索算法程序
- sscanf函数和正则表达式
- 数据库系统内部的模式结构
- usaco 2.1.5 Hamming Codes
- 编译原理——变量声明语句(五)
- 【Android】Uri、UriMatcher、ContentUris详解
- bash: ifconfig: command not found