PL/X语言虚拟机指令系统及其解释
更新时间:2024-02-22 16:22:01 阅读量: 经典范文大全 文档下载
- go语言需要虚拟机吗推荐度:
- 相关推荐
虚拟机指令系统及其解释
INT //给变量预留位置
LIT //目标指令,把一个常数置入栈顶
LOD //目标指令,把一个变量置入栈顶
STO //目标指令,从栈顶把一个数置入到一个变量里
JMP //目标指令,无条件转移
JPC //目标指令,有条件转移(当条件为0时转移)
OPR //目标指令,算术和关系运算
WRT //目标指令,打印栈顶数据
OPR_PLUS // +
OPR_MINUS // -
OPR_TIMES // *
OPR_SLASH // /
OPR_OPPO //取负
OPR_EQL // =
OPR_LSS // <
OPR_LEQ // <=
OPR_GTR // >
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];
case OPR_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_LEQ:
if(dataStack[stackCount-2] <= dataStack[stackCount-1])
dataStack[stackCount-2] = TRUE;
else
dataStack[stackCount-2] = FALSE;
stackCount--;
OPR_GTR:
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]);
模块功能介绍
//******************************************************************/
//函数原型:int main(int argc,char * argv[])
//参数说明:argv[1]: 源程序文件的文件名
//函数功能:主程序
//返回值 :0表示正常退出
//******************************************************************/
//******************************************************************/
//函数原型:int loadProgram(int paraNum, char ** paraStr)
//参数说明:paraNum: 命令行输入时的参数个数
// paraStr: 命令行输入的字符串内容
//函数功能:将源程序读入sourceProgram[]字符串
//返回值 :1,表示用户输入时有-a选项,需要打印生成目标代码;0表示不需要
//******************************************************************/
//******************************************************************/
//函数原型:void yacc_prog()
//参数说明:无
//函数功能:语法分析分程序之prog
//返回值 :无
//******************************************************************/
//******************************************************************/
//函数原型:void printDesCode()
//参数说明:无
//函数功能:打印生成的目标代码
//返回值 :无
//******************************************************************/
//******************************************************************/
//函数原型:void interpret()
//参数说明:无
//函数功能:解释程序
//返回值 :无
//******************************************************************/
//******************************************************************/
//函数原型:void getSym()
//参数说明:无
//函数功能:词法分析主程序
//返回值 :无
//******************************************************************/
//******************************************************************/
//函数原型:void getChar()
//参数说明:无
//函数功能:从sourceProgram[]读入一个字符,放入ch中
//返回值 :无
//******************************************************************/
5.全局数据结构、常量和变量
/********************宏定义**********************/
#define BUF_SIZE 64 //从文件中读取源程序时,使用的缓冲大小
#define MAX_PRO_LEN 65536 //源程序长度上限,根据需要可以更改
#define ID_LEN 10 //标识符长度
#define NUM_LEN 9 //常数最多能够容纳的位数
#define NUM_OF_RESERVED_ID 18 //保留关键字个数
#define MAX_TABLE_LEN 128 //符号表最多项数
#define MAX_CODE_LEN 1024 //目标代码长度上限
#define MAX_STACK_LEN 256 //数据栈大小上限
#define PROGRAM 0 //program
#define INTEGER 1 //integer
#define LOGICAL 2 //logical
#define IF 3 //if
#define THEN 4 //then
#define ELSE 5 //else
#define WHILE 6 //while
#define REPEAT 7 //repeat
#define BEGIN 8 //begin
#define END 9 //end
#define OR 10 //or
#define AND 11 //and
#define NOT 12 //not
#define TRUE 13 //true
#define FALSE 14 //false
#define DO 15 //do
#define UNTIL 16 //until
#define WRITE 17 //write
#define PLUS 18 // +
#define MINUS 19 // -
#define TIMES 20 // *
#define SLASH 21 // /
#define LPAREN 22 // (
#define RPAREN 23 // )
#define EQL 24 // =
#define COMMA 25 // ,
#define SEMICOLON 26 // ;
#define PERIOD 27 // .
#define BECOMES 28 // :=
#define NUL 29 // :
#define LSS 30 // <
#define LEQ 31 // <=
#define GTR 32 // >
#define GEQ 33 // >=
#define NUMBER 34 // 数字
#define IDENT 35 // 标识符
#define INT 40 //给变量预留位置
#define LIT 41 //目标指令,把一个常数置入栈顶
#define LOD 42 //目标指令,把一个变量置入栈顶
#define STO 43 //目标指令,从栈顶把一个数置入到一个变量里
#define JMP 44 //目标指令,无条件转移
#define JPC 45 //目标指令,有条件转移(当条件为0时转移)
#define OPR 46 //目标指令,算术和关系运算
#define WRT 47 //目标指令,打印栈顶数据
#define OPR_PLUS 50 // +
#define OPR_MINUS 51 // -
#define OPR_TIMES 52 // *
#define OPR_SLASH 53 // /
#define OPR_OPPO 54 //取负
#define OPR_EQL 55 // =
#define OPR_LSS 56 // <
#define OPR_LEQ 57 // <=
#define OPR_GTR 58 // >
#define OPR_GEQ 59 // >=
#define OPR_OR 60 // or
#define OPR_AND 61 // and
/*******************结构体定义*********************/
//符号表格式
typedef struct
{
char name[ID_LEN];
int kind;
int offSet;
}TABLE;
//目标代码格式
typedef struct
{
int funCode;
int offset;
}INSTRUCTION;
/********************变量声明**********************/
extern char * word[NUM_OF_RESERVED_ID]; //保留关键字集
extern int wsym[NUM_OF_RESERVED_ID]; //保留关键字对应的sym标识
extern char * letter; //a...z字母集
extern char* number; //0...9数字集
extern char* letter_number; //a...z,0...9集
extern char sourceProgram[MAX_PRO_LEN]; //存放源程序的字符数组
extern int sCount; //指向sourceProgram的下标,指明当前分析到哪里
extern int totalCount; //sourceProgram[]有效数据的长度
extern char ch; //词法分析中,存放当前被取到的字符
extern int sym; //词法分析中,指明当前取到的字符串的类型
extern char ident[ID_LEN]; //词法分析中,存放当前被取到的标识符
extern long num; //词法分析中,存放当前被取到的常数
extern TABLE table[MAX_TABLE_LEN];
extern int tableCount;
extern INSTRUCTION code[MAX_CODE_LEN]; //程序存储器
extern int codeCount; //程序存储器索引
extern int dataStack[MAX_STACK_LEN]; //数据栈
extern int stackCount; //数据栈索引
extern int maxCodeCount; //程序存储器存放的目标代码数量
extern int errorCount; //记录错误发生的次数
/********************函数声明**********************/
extern void init();
extern int loadProgram(int, char **);
//词法分析程序
extern void getSym();
extern void getChar();
extern int ifCharInStr(char *);
//语法分析程序
extern void enterTable(int);
extern int position(char *);
extern void gen(int, int);
extern void yacc_prog();
extern void yacc_ds();
extern void yacc_ss();
extern void yacc_d();
extern void yacc_s();
extern void yacc_ae();
extern void yacc_at();
extern void yacc_af();
extern void yacc_be();
extern void yacc_bt();
extern void yacc_bf();
extern void yacc_re();
//出错处理程序
extern void errorOccur(int);
extern void printDesCode();
extern void interpret();
正在阅读:
PL/X语言虚拟机指令系统及其解释02-22
人教版八年级上数学分式的概念和性质(基础)知识讲解09-12
2013届高考生物复习夺标学案 专题04 物质跨膜运输、酶与ATP 新人教版01-20
中国家用电器开关行业市场前景分析预测报告(目录) - 图文03-05
室内进户门安装技术交底10-02
挖掘机安全操作规程05-13
2019年助人为乐道德模范先进事迹材料(精选多篇)-精选word文档04-27
堕胎过多会导致不孕么?04-20
- 关于实施新冠肺炎疫情精准防控的指导意见
- 学生党员在疫情期间做出的思想汇报
- 《深度工作》读书感悟
- 抗"疫"期间思想汇报5篇
- 学校承诺书|面对疫情,我们承诺
- 公司战“疫”感悟_我想和你们在一起
- 国培送教下乡培训感悟总结
- 只盼“樱花”早盛开,烂漫如当年
- 疫情防控工作感悟
- 关于疫情的几点思考及感悟
- 读蒋廷黻《中国近代史》有感
- 党小组长培训资料汇
- 2019年度副镇长述职述德述廉报告
- 疫情期间教师直播感悟
- 新型冠状病毒肺炎疫情防控心得体会4篇
- 在书记抓党建工作述职评议大会上的讲话
- 《老师请回答》观后感
- 2020年党组织书记党建工作考核办法
- 在疫情防控暨企业复工复产工作会议上的讲话
- 企业疫期复工管理方式与措施
- 指令
- 解释
- 及其
- 语言
- 虚拟
- 系统
- PL
- 【廉政教育】周总理的廉政语录
- 《读人研究报告》
- 驻村干部抓农村基层党建责任清单和任务清单范文
- 读《活着》有感
- 读《半棵树》之感
- 党支部经常性工作清单范文
- 党课讲稿:《你离党员有多远?》
- 党内组织生活“六制” 支部主题党日活动“六规范”
- 国旗下演讲:让青春与理想作伴
- 国旗下演讲:运动会动员
- 初中生数学运算能力的现状分析和培养
- 读《这样爱你刚刚好,我的一年级孩子》有感
- 读《近得我还是我,远得还爱得着你》有感
- 风雨长岗墟,演绎了多少沧桑故事
- 改革开放征文 40年改革开放给我们的一些感悟和启迪
- 「党建知识」如何做好党员管理工作
- 改革开放40年征文 穿”越母亲衣橱里的岁月
- 读《觉醒的力量》有感
- 征文鉴赏 贫困的答案
- 七座车年检要撕遮阳膜吗?为什么?