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();
《PL/X语言虚拟机指令系统及其解释》出自:百味书屋
链接地址:http://www.850500.com/news/184152.html
转载请保留,谢谢!