📄 translator.java
字号:
/* 将寄存器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 + -