⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 translator.java

📁 该文件为编译器解释器的代码
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
		/* 将寄存器reg[r]赋值为操作数m的值 */
        	reg[r] = m; 

    	    /**********************************************/
    	    else if(ssiop.equals("LDC")) 
		/* 将寄存器reg[r]赋值为当前指令的第二操作数的值 */
        	reg[r] = currentinstruction.iarg2; 

            /**********************************************/
    	    else if(ssiop.equals("JLT")) 
    	    {
		/* 如果寄存器reg[r]的值小于0,则将程序计数器reg[PC_REG]的值	*
		 * 赋值为立即数m,产生小于条件跳转		*/
        	if(reg[r] <  0) 
            	    reg[PC_REG] = m; 
    	    }

    	    /**********************************************/
    	    else if(ssiop.equals("JLE")) 
    	    {
		/* 如果寄存器reg[r]的值小于等于0,则将程序计数器reg[PC_REG]的值	*
		 * 赋值为立即数m,产生小于等于条件跳转		*/
        	if(reg[r] <=  0) 
           	    reg[PC_REG] = m;
    	    }

    	    /**********************************************/
    	    else if(ssiop.equals("JGT")) 
    	    {
		/* 如果寄存器reg[r]的值大于0,则将程序计数器reg[PC_REG]的值	*
	 	* 赋值为立即数m,产生大于条件跳转		*/
        	if(reg[r] >  0) 
            	    reg[PC_REG] = m; 
    	    }

    	    /**********************************************/
    	    else if(ssiop.equals("JGE"))
    	    { 
		/* 如果寄存器reg[r]的值大于等于0,则将程序计数器reg[PC_REG]的值	*
	 	* 赋值为立即数m,产生大于等于跳转			*/
        	if(reg[r] >=  0) 
            	    reg[PC_REG] = m;
    	    }

    	    /**********************************************/
    	    else if(ssiop.equals("JEQ"))
    	    { 
		/* 如果寄存器reg[r]的值等于0,则将程序计数器reg[PC_REG]的值	*
	 	* 赋值为立即数m,产生等于条件跳转		*/
        	if (reg[r] == 0) 
            	    reg[PC_REG] = m; 
    	    }

    	    /**********************************************/
    	    else if(ssiop.equals("JNE")) 
    	    {
		/* 如果寄存器reg[r]的值不等于0,则将程序计数器reg[PC_REG]的值	*
	 	* 赋值为立即数m,产生不等于条件跳转			*/
        	if (reg[r] != 0) 
            	    reg[PC_REG] = m;
    	    }
    	    if(cmd!='g')   /*决定进入哪个循环*/
            {
        	/* stepcnt此时用于记录将要执行,输出的指令或数据的数量,自减 */
                stepcnt--;
                if((stepcnt > 0) && (stepResult.equals("OKAY")))
                {
    		    /* 取得程序计数器reg[PC_REG]中当前指令地址 */
    		    iloc = reg[PC_REG];

    		    /* 根据执行指令追踪标志traceflag,将当前指令地址iloc上指令输出到屏幕 */
    		    if(traceflag) 
    		    {
        		name=" ";
        		writeInstruction(iloc);
    		    }
                }
                else
                    step0();
            }
    	    else
    	    {		
    		/* 执行过指令计数stepcnt加1 */
    		stepcnt++;

    		if(stepResult.equals("OKAY"))
    		{
           	    /* 根据执行指令追踪标志traceflag,将当前地址iloc上指令输出到屏幕 */
    		    iloc = reg[PC_REG];

    		    /* 根据执行指令追踪标志traceflag,将当前指令地址iloc上指令输出到屏幕 */
    		    if(traceflag) 
    		    {
        		name=" ";
        		writeInstruction(iloc);
    		    }
   	        }
    		else
    		{
		    /* 根据执行执行数量追踪标志icountflag,显示已经执行过的指令数量 */
        	    if (icountflag)
		    {
            		name="已经执行过的指令数量";
            		expr=expr+"Number of instructions executed ="+String.valueOf(stepcnt)+"\n";
        	    }
        	    step0();
    		}
    	    }
        }
    }while(stepResult.equals("OKAY"));
    if(ssiop.equals("IN")) 
        enterData();
} 

/********************************************************/
/* 函数名 writeInstruction				*/
/* 功  能 指令输出函数					*/
/* 说  明 该函数将指令存储区中指令以指定格式输出到屏幕	*/
/********************************************************/
void writeInstruction(int loc)
{  
    String wstr;
    /* loc为所要输出的指令在指令存储区中地址,输出到屏幕 */
    wstr=String.valueOf(loc);

    /* 输出指令地址loc在0-1023有效的指令存储区地址范围之内 */
    if ((loc >= 0)&&(loc < IADDR_SIZE))
    { 
        /* 输出地址为loc上的指令操作码值iMem[loc].iop和第一操作数iMem[loc].iarg1 */
	wstr=wstr+iMem[loc].iop+"   "+String.valueOf(iMem[loc].iarg1);

	/* 根据指令的寻址模式分类处理 */
        String ss=opClass(opNum(iMem[loc].iop));
        if(ss.equals("opclRR"))
            /* 输出指令为寄存器寻址模式指令,以给定形式输出操作数2,操作数3 */
	    wstr=wstr+String.valueOf(iMem[loc].iarg2)+","+String.valueOf(iMem[loc].iarg3);	
        else if((ss.equals("opclRM"))||(ss.equals("opclRA")))
            /* 输出指令为寄存器-立即数寻址模式指令,和寄存器-内存寻址模式指令	*
	     * 以给定形式输出操作数2,操作数3		*/
            wstr=wstr+String.valueOf(iMem[loc].iarg2)+"("+String.valueOf(iMem[loc].iarg3)+")";	
     }
     /* 向屏幕输出换行符 */
     wstr=wstr+"\n";

    expr=expr+wstr;
    //xwin1=new XWindow(null,wstr);/
    //xwin1.setVisible(true);
} 

}


class TokenType
{ 
    int lineshow;
    String Lex;
    String Sem;
} 
class ChainNodeType  
{
    TokenType  Token=new TokenType();      //单词
    ChainNodeType nextToken=null;          //指向下一个单词的指针
}
/******************************************/
class SymbTable  /* 在语义分析时用到 */
{
    String idName;
    AttributeIR  attrIR=new AttributeIR();
    SymbTable next=null;
}
class AttributeIR
{
    TypeIR  idtype=new TypeIR();
    String kind;	
    Var var;
    Proc proc;
}
class Var
{
    String access;
    int level;
    int off;
    boolean isParam;
}
class Proc
{
    int level;
    ParamTable param;
    int mOff;
    int nOff;
    int procEntry;
    int codeEntry;
}
class ParamTable
{
    SymbTable entry=new SymbTable();
    ParamTable next=null;
}
class TypeIR
{
    int size;
    String kind;
    Array array=null;
    FieldChain body=null;
}
class Array
{
    TypeIR indexTy=new TypeIR();
    TypeIR elementTy=new TypeIR();
    int low;
    int up;
}
class FieldChain
{
    String id;
    int off;
    TypeIR unitType=new TypeIR();
    FieldChain next=null;
}
/*******************************************/
class TreeNode   /* 语法树结点的定义 */
{
    TreeNode child[]=new TreeNode[3];
    TreeNode sibling=null;
    int lineno;
    String nodekind;
    String kind;
    int idnum;
    String name[]=new String[10];
    SymbTable table[]=new SymbTable[10];
    Attr attr=new Attr();
}   
class Attr
{
    ArrayAttr arrayAttr=null;  /* 只用到其中一个,用到时再分配内存 */
    ProcAttr procAttr=null;
    ExpAttr expAttr=null;
    String type_name;
}
class ArrayAttr
{
    int low;
    int up;
    String childtype;
}
class ProcAttr
{
    String paramt;
}
class ExpAttr
{
    String op;
    int val;
    String varkind;
    String type;
}
/*源程序对应的中间代码序列表示*/
class CodeFile
{   
    CodeR codeR=new CodeR();
    CodeFile former=null;
    CodeFile next=null;
}
/*中间代码的结构*/
class CodeR
{    
    String codekind;
    ArgRecord arg1;  
    ArgRecord arg2;
    ArgRecord arg3;
}  
class ArgRecord  
{  
    String form;
    MidAttr midAttr=new MidAttr();  /*变量的ARG结构需要纪录的信息*/
}  
class MidAttr		
{  
    int value;  /*纪录整数值*/
    int label;  /*纪录标号的值*/
    Addr addr;
}
class Addr
{ 
    String name;    /*注:变量名字已经没用,这里保留只是为了显示结果清晰*/
    int dataLevel;
    int dataOff;
    String access;  /*类型AccessKind在前面定义*/
}
/*常量定值表,用于常表达式优化*/
class ConstDefT
{ 
    ArgRecord variable=new ArgRecord();   /*用变量的ARG结构表示变量*/
    int constValue;       /*定值*/
    ConstDefT former=null;
    ConstDefT next=null;
} 
/*值编码表ValuNum*/
class ValuNum
{
    ArgRecord arg=new ArgRecord();
    String access;
    CodeInfo codeInfo=new CodeInfo();
    /*指向下一个节点指针*/
    ValuNum next=null;
}
class CodeInfo
{
    int valueCode;   /*直接变量,存储值编码*/
    TwoCode twoCode=null;
}
class TwoCode
{
    int valuecode;
    int addrcode;         /*间接临时变量,存储值编码和地址码*/
}
/*中间代码对应的映象码结构*/
class MirrorCode
{  
    int op1;
    int op2;
    int result;
} 
/*可用表达式代码表UsableExpr*/
class UsableExpr
{ 
    CodeFile code=null;	   /*中间代码地址*/
    MirrorCode mirrorC=null;    /*映象码*/
    UsableExpr next=null;  /*指向下一个节点*/
} 
/*临时变量的等价表TempEqua*/
class TempEqua
{
    ArgRecord arg1=null; /*被替换的临时变量*/
    ArgRecord arg2=null; /*用于替换的临时变量*/
    TempEqua next=null;
} 
/*循环信息表*/
class LoopInfo
{
    int state;            /*循环状况,为0时表示本层循环不可外提*/
    CodeFile whileEntry;  /*指向循环入口中间代码*/
    int varDef;           /*指向本层循环的变量地址表起始处*/
    CodeFile whileEnd;    /*指向循环出口中间代码*/
}    
/*循环信息栈*/
class LoopStack
{ 
    LoopInfo loopInfo;
    LoopStack under=null;
} 
/*标号地址表*/
class LabelAddr
{
    int label;
    int destNum;
    LabelAddr next=null;
} 
/*处理回填地址要用到的数据结构*/
class BackAddr
{  
    int backLoc;
    BackAddr former=null;
}
/*****************************************************/
/********************************************************************/
/* 类  名 Target	                                            */
/* 功  能 总程序的处理					            */
/* 说  明 建立一个类,处理总程序                                    */
/********************************************************************/
class Target
{
BackAddr AddrTop;
LabelAddr labelAddrT;
int AddrEMPTY;

int tmpOffset = 0;           /*临时变量区的偏移*/

/* TM指令当前生成代码写入地址 */
int emitLoc = 0 ;

/* 用于在函数emitSkip,emitBackup,emitRestore	
   中作为当前最高生成代码写入地址,初始为0 */
int highEmitLoc = 0;

boolean TraceCode=true;    /* 代码生成追踪标志 */

int mainOff;

/* 程序指令指示器pc为7,指向当前指令存储位置	
   程序指示器将使用寄存器数组中的第8个寄存器	*/
int pc=7;	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -