PL/X语言虚拟机指令系统及其解释

更新时间:2024-02-22 16:22:01 阅读量: 经典范文大全 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
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_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();

本文来源:https://www.bwwdw.com/article/gv3b.html

Top