编译原理——赋值语句和简单表达式(一)
2012-03-30 22:34
183 查看
Compile.java
package per.eyuan.compile; import per.eyuan.util.ConstantTable; import per.eyuan.util.FourItemStack; import per.eyuan.util.IdentifierTable; import per.eyuan.util.TemporaryTable; import per.eyuan.util.TwoItem; import per.eyuan.util.TwoItemStack; public class Compile { IdentifierTable idt=new IdentifierTable();//标识符表 ConstantTable cont=new ConstantTable();//常数表 TemporaryTable tt=new TemporaryTable();//临时变量表 TwoItemStack tis=new TwoItemStack();//二元式栈 FourItemStack fis=new FourItemStack();//四元式栈 Initialise init=new Initialise(); IO io=new IO();//读取源代码 Lexical lex=new Lexical();//词法分析 Syntax syn=new Syntax();//语法分析 public void inverted(){ TwoItemStack ntis=new TwoItemStack(); ntis.push(new TwoItem("#","-")); //反序 int j=tis.getLength(); for(int i=0;i<j;i++){ ntis.push(tis.pop()); System.out.println(i+" "+tis.getLength()+" "+ntis.getLength()); } tis=ntis; } public static void main(String[] args) { Compile com=new Compile(); //test System.out.println("未对标志符表和常数表进行初始化:"); System.out.println("标志符中标志符的个数为:"+com.idt.getCount()); System.out.println("常数表中常数的个数为:"+com.cont.getCount()); //对标志符表和常数表进行初始化,即模拟完成词法分析部分 com.init.setIdt(com.idt); com.init.setCont(com.cont); com.init.init(); //test System.out.println("对标志符表和常数表进行初始化后:"); System.out.println("标志符中标志符的个数为:"+com.idt.getCount()); for(int i=0;i<com.idt.getCount();i++) System.out.println(com.idt.getId(i).getIndex()+" "+com.idt.getId(i).getName()+" "+com.idt.getId(i).getType()+" "+com.idt.getId(i).getValue()); System.out.println("常数表中常数的个数为:"+com.cont.getCount()); for(int i=0;i<com.cont.getCount();i++) System.out.println(com.cont.getConstant(i).getIndex()+" "+com.cont.getConstant(i).getType()+" "+com.cont.getConstant(i).getValue()); //test System.out.println("二元式表最初为:"); System.out.println("二元式长度:"+com.tis.getLength()); com.lex.setIdt(com.idt);//传递标识符表给词法分析 com.lex.setTis(com.tis);//二元式表 com.lex.setStatement(com.io.sb.toString());//传递读取的源代码 com.lex.analyse();//转换源代码形式,修改二元式,修改标识符表(value) //test System.out.println("词法分析后的二元式栈为:"); for(int i=0;i<com.tis.getLength();i++) System.out.println("("+com.tis.getAll()[i].getCategory()+","+com.tis.getAll()[i].getInside()+")"); //将二元式栈中有效元素反序存放 com.inverted(); System.out.println("对二元式栈中有效元素反序存放后:"); for(int i=0;i<com.tis.getLength();i++) System.out.println("("+com.tis.getAll()[i].getCategory()+","+com.tis.getAll()[i].getInside()+")"); //test System.out.println("四元式栈初始内容:"); System.out.println("四元式个数:"+com.fis.getLength()); System.out.println("临时变量表初始内容:"); System.out.println("临时变量个数:"+com.tt.getCount()); com.syn.setIdt(com.idt);//将标识符表传递给语法分析 com.syn.setCont(com.cont);//将常数符表传递给语法分析 com.syn.setTt(com.tt);//将临时变量表传递给语法分析 com.syn.setTis(com.tis);//将二元式栈传递到语法分析 com.syn.setFis(com.fis);//将四元式栈传递给语法分析 com.syn.analyse(); //test System.out.println("标志符表内容为:"); for(int i=0;i<com.idt.getCount();i++) System.out.println(com.idt.getId(i).getIndex()+" "+com.idt.getId(i).getName()+" "+com.idt.getId(i).getValue()); System.out.println("常数表内容为:"); for(int i=0;i<com.cont.getCount();i++) System.out.println(com.cont.getConstant(i).getIndex()+" "+com.cont.getConstant(i).getValue()); System.out.println("临时变量表内容为:"); for(int i=0;i<com.tt.getCount();i++) System.out.println(com.tt.getTemp(i).getIndex()+" "+com.tt.getTemp(i).getValue()); System.out.println("四元式为:"); for(int i=0;i<com.fis.getLength();i++) System.out.println("("+com.fis.getAll()[i].getOp()+","+com.fis.getAll()[i].getArg1()+","+com.fis.getAll()[i].getArg2()+","+com.fis.getAll()[i].getResult()+")"); } }
相关文章推荐
- 编译原理——赋值语句和简单表达式(十五)
- 编译原理——赋值语句和简单表达式(三)
- 编译原理——赋值语句和简单表达式(四)
- 编译原理——赋值语句和简单表达式(十八)
- 编译原理——赋值语句与简单表达式(七)
- 编译原理——赋值语句与简单表达式(八)
- 编译原理——赋值语句和简单表达式(九)
- 编译原理——赋值语句和简单表达式(十)
- 编译原理——赋值语句与简单表达式(十一)
- 编译原理——赋值语句和简单表达式(十二)
- 编译原理——赋值语句和简单表达式(十三)
- 编译原理——赋值语句和简单表达式(十四)
- 编译原理——赋值语句和简单表达式(二)
- 编译原理——赋值语句和简单表达式(十六)
- 编译原理——赋值语句和简单表达式(十七)
- 编译原理——赋值语句与简单表达式(五)
- 编译原理——赋值语句和简单表达式(十九)
- 编译原理——赋值语句与简单表达式(六)
- [系列][编译原理]上下文无关文法及分析
- 跟vczh看实例学编译原理