PLX语言虚拟机指令系统及其解释.docx
- 文档编号:13992111
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:12
- 大小:16.79KB
PLX语言虚拟机指令系统及其解释.docx
《PLX语言虚拟机指令系统及其解释.docx》由会员分享,可在线阅读,更多相关《PLX语言虚拟机指令系统及其解释.docx(12页珍藏版)》请在冰点文库上搜索。
PLX语言虚拟机指令系统及其解释
PL/X语言虚拟机指令系统及其解释
各位读友大家好,此文档由网络收集而来,欢迎您下载,谢谢
虚拟机指令系统及其解释
INT//给变量预留位置
LIT//目标指令,把一个常数置入栈顶
LOD//目标指令,把一个变量置入栈顶
STO//目标指令,从栈顶把一个数置入到一个变量里
JMP//目标指令,无条件转移
JPC//目标指令,有条件转移(当条件为0时转移)
OPR//目标指令,算术和关系运算
WRT//目标指令,打印栈顶数据
OPR_PLUS//+
OPR_MINUS//-
OPR_TIMES//*
OPR_SLASH///
OPR_OPPO//取负
OPR_EQL//=
OPR_LSS//
OPR_GEQ//>=
OPR_OR//or
OPR_AND//and
INT:
stackCount=code[i].offset;
LIT:
dataStack[stackCount++]=code[i].offset;
LOD:
dataStack[stackCount++]=dataStack[code[i].offset];
STO:
dataStack[code[i].offset]=dataStack[--stackCount];
JMP:
i=code[i].offset;
JPC:
if(dataStack[--stackCount]==FALSE)
i=code[i].offset;
OPR_PLUS:
dataStack[stackCount-2]=dataStack[stackCount-2]+dataStack[stackCount-1];
stackCount--;
OPR_MINUS:
dataStack[stackCount-2]=dataStack[stackCount-2]-dataStack[stackCount-1];
stackCount--;
OPR_TIMES:
dataStack[stackCount-2]=dataStack[stackCount-2]*dataStack[stackCount-1];
stackCount--;
OPR_SLASH:
dataStack[stackCount-2]=dataStack[stackCount-2]/dataStack[stackCount-1];
stackCount--;
OPR_OPPO:
dataStack[stackCount-1]=-dataStack[stackCount-1];
caseOPR_EQL:
if(dataStack[stackCount-2]==dataStack[stackCount-1])
dataStack[stackCount-2]=TRUE;
else
dataStack[stackCount-2]=FALSE;
stackCount--;
OPR_LSS:
if(dataStack[stackCount-2]dataStack[stackCount-1])
dataStack[stackCount-2]=TRUE;
else
dataStack[stackCount-2]=FALSE;
stackCount--;
OPR_GEQ:
if(dataStack[stackCount-2]>=dataStack[stackCount-1])
dataStack[stackCount-2]=TRUE;
else
dataStack[stackCount-2]=FALSE;
stackCount--;
OPR_OR:
if(dataStack[stackCount-2]==TRUE||dataStack[stackCount-1]==TRUE)
dataStack[stackCount-2]=TRUE;
else
dataStack[stackCount-2]=FALSE;
OPR_AND:
if(dataStack[stackCount-2]==TRUE&&dataStack[stackCount-1]==TRUE)
dataStack[stackCount-2]=TRUE;
else
dataStack[stackCount-2]=FALSE;
WRT:
printf(“%d\n”,dataStack[stackCount-1]);
模块功能介绍
//******************************************************************/
//函数原型:
intmain(intargc,char*argv)
//参数说明:
argv[1]:
源程序文件的文件名
//函数功能:
主程序
//返回值:
0表示正常退出
//******************************************************************/
//******************************************************************/
//函数原型:
intloadProgram(intparaNum,char**paraStr)
//参数说明:
paraNum:
命令行输入时的参数个数
//paraStr:
命令行输入的字符串内容
//函数功能:
将源程序读入sourceProgram字符串
//返回值:
1,表示用户输入时有-a选项,需要打印生成目标代码;0表示不需要
//******************************************************************/
//******************************************************************/
//函数原型:
voidyacc_prog()
//参数说明:
无
//函数功能:
语法分析分程序之prog
//返回值:
无
//******************************************************************/
//******************************************************************/
//函数原型:
voidprintDesCode()
//参数说明:
无
//函数功能:
打印生成的目标代码
//返回值:
无
//******************************************************************/
//******************************************************************/
//函数原型:
voidinterpret()
//参数说明:
无
//函数功能:
解释程序
//返回值:
无
//******************************************************************/
//******************************************************************/
//函数原型:
voidgetSym()
//参数说明:
无
//函数功能:
词法分析主程序
//返回值:
无
//******************************************************************/
//******************************************************************/
//函数原型:
voidgetChar()
//参数说明:
无
//函数功能:
从sourceProgram读入一个字符,放入ch中
//返回值:
无
//******************************************************************/
5.全局数据结构、常量和变量
/********************宏定义**********************/
#defineBUF_SIZE64//从文件中读取源程序时,使用的缓冲大小
#defineMAX_PRO_LEN65536//源程序长度上限,根据需要可以更改
#defineID_LEN10//标识符长度
#defineNUM_LEN9//常数最多能够容纳的位数
#defineNUM_OF_RESERVED_ID18//保留关键字个数
#defineMAX_TABLE_LEN128//符号表最多项数
#defineMAX_CODE_LEN1024//目标代码长度上限
#defineMAX_STACK_LEN256//数据栈大小上限
#definePROGRAM0//program
#defineINTEGER1//integer
#defineLOGICAL2//logical
#defineIF3//if
#defineTHEN4//then
#defineELSE5//else
#defineWHILE6//while
#defineREPEAT7//repeat
#defineBEGIN8//begin
#defineEND9//end
#defineOR10//or
#defineAND11//and
#defineNOT12//not
#defineTRUE13//true
#defineFALSE14//false
#defineDO15//do
#defineUNTIL16//until
#defineWRITE17//write
#definePLUS18//+
#defineMINUS19//-
#defineTIMES20//*
#defineSLASH21///
#defineLPAREN22//(
#defineRPAREN23//)
#defineEQL24//=
#defineCOMMA25//,
#defineSEMICOLON26//;
#definePERIOD27//.
#defineBECOMES28//:
=
#defineNUL29//:
#defineLSS30//
#defineGEQ33//>=
#defineNUMBER34//数字
#defineIDENT35//标识符
#defineINT40//给变量预留位置
#defineLIT41//目标指令,把一个常数置入栈顶
#defineLOD42//目标指令,把一个变量置入栈顶
#defineSTO43//目标指令,从栈顶把一个数置入到一个变量里
#defineJMP44//目标指令,无条件转移
#defineJPC45//目标指令,有条件转移(当条件为0时转移)
#defineOPR46//目标指令,算术和关系运算
#defineWRT47//目标指令,打印栈顶数据
#defineOPR_PLUS50//+
#defineOPR_MINUS51//-
#defineOPR_TIMES52//*
#defineOPR_SLASH53///
#defineOPR_OPPO54//取负
#defineOPR_EQL55//=
#defineOPR_LSS56//
#defineOPR_GEQ59//>=
#defineOPR_OR60//or
#defineOPR_AND61//and
/*******************结构体定义*********************/
//符号表格式
typedefstruct
{
charname[ID_LEN];
intkind;
intoffSet;
}TABLE;
//目标代码格式
typedefstruct
{
intfunCode;
intoffset;
}INSTRUCTION;
/********************变量声明**********************/
externchar*word[NUM_OF_RESERVED_ID];//保留关键字集
externintwsym[NUM_OF_RESERVED_ID];//保留关键字对应的sym标识
externchar*letter;//a...z字母集
externchar*number;//0...9数字集
externchar*letter_number;//a...z,0...9集
externcharsourceProgram[MAX_PRO_LEN];//存放源程序的字符数组
externintsCount;//指向sourceProgram的下标,指明当前分析到哪里
externinttotalCount;//sourceProgram有效数据的长度
externcharch;//词法分析中,存放当前被取到的字符
externintsym;//词法分析中,指明当前取到的字符串的类型
externcharident[ID_LEN];//词法分析中,存放当前被取到的标识符
externlongnum;//词法分析中,存放当前被取到的常数
externTABLEtable[MAX_TABLE_LEN];
externinttableCount;
externINSTRUCTIONcode[MAX_CODE_LEN];//程序存储器
externintcodeCount;//程序存储器索引
externintdataStack[MAX_STACK_LEN];//数据栈
externintstackCount;//数据栈索引
externintmaxCodeCount;//程序存储器存放的目标代码数量
externinterrorCount;//记录错误发生的次数
/********************函数声明**********************/
externvoidinit();
externintloadProgram(int,char**);
//词法分析程序
externvoidgetSym();
externvoidgetChar();
externintifCharInStr(char*);
//语法分析程序
externvoidenterTable(int);
externintposition(char*);
externvoidgen(int,int);
externvoidyacc_prog();
externvoidyacc_ds();
externvoidyacc_ss();
externvoidyacc_d();
externvoidyacc_s();
externvoidyacc_ae();
externvoidyacc_at();
externvoidyacc_af();
externvoidyacc_be();
externvoidyacc_bt();
externvoidyacc_bf();
externvoidyacc_re();
//出错处理程序
externvoiderrorOccur(int);
externvoidprintDesCode();
externvoidinterpret();
《PL/X语言虚拟机指令系统及其解释》
各位读友大家好,此文档由网络收集而来,欢迎您下载,谢谢
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PLX 语言 虚拟机 指令系统 及其 解释