您的位置:百味书屋 > 范文大全 > 经典范文 > PL/X语言虚拟机指令系统及其解释 正文 本文移动端:PL/X语言虚拟机指令系统及其解释

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

2018-10-31 09:00:17 来源网站: 百味书屋

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
转载请保留,谢谢!
相关文章
推荐范文