您的位置:首页 > 其它

编译原理——赋值语句和简单表达式(一)

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()+")");

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: