-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcommon.h
270 lines (246 loc) · 6.19 KB
/
common.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
#pragma once
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <assert.h>
#include <iostream>
#include <Afxtempl.h >
#include <malloc.h>
#define FILENAMESIZE 512 //文件名的最大长度
#define NUMOFWORD 12 //保留字的个数
#define MAXNUMOFNAMETABLE 1000 //名字表的最大项数
#define MAXNUMOFBLOCKTABLE 100 //程序体表的最大项数
#define MAXNUMOFARRAYTABLE 100//数组信息表的最大项数
#define MAXSYMNAMESIZE 255 //符号的最大字符数
#define MAXVARNAMESIZE 255 //变量名的最大字符数
#define MAXLEVELDEPTH 100 //过程嵌套的最大深度
#define MAXNUMOFCODEADDRESS 10000 //最大的地址空间
typedef enum _SYMBOL //token的定义
{
NUL,//0
IDENFR,//1
INTCON, // IntConst
STRCON, //FormatString
MAINTK, // main
CONSTTK, // const
INTTK, //int
BREAKTK, //break
CONTINUETK, //continue
IFTK, //if
ELSETK, // else
NOT, // !
AND, // &&
OR, // ||
WHILETK, //while
GETINTTK, //getint
PRINTFTK, //printf
RETURNTK, // return
PLUS, // +
MINU, // -
VOIDTK, // void
MULT, // *
DIV, // /
MOD, // %
LSS, // <
LEQ, // <=
GRE, // >
GEQ, // >=
EQL, // ==
NEQ, // !=
ASSIGN, // =
SEMICN, // ;
COMMA, // ,
LPARENT, // (
RPARENT, // )
LBRACK, // [
RBRACK, // ]
LBRACE, // {
RBRACE, // }
ARRAY
} SYMBOL;
char symbol_name[39][20] = //token的定义
{
"NUL",//0
"IDENFR",//1
"INTCON", // IntConst
"STRCON", //FormatString
"MAINTK", // main
"CONSTTK", // const
"INTTK", //int
"BREAKTK", //break
"CONTINUETK", //continue
"IFTK", //if
"ELSETK", // else
"NOT", // !
"AND", // &&
"OR", // ||
"WHILETK", //while
"GETINTTK", //getint
"PRINTFTK", //printf
"RETURNTK", // return
"PLUS", // +
"MINU", // -
"VOIDTK", // void
"MULT", // *
"DIV", // /
"MOD", // %
"LSS", // <
"LEQ", // <=
"GRE", // >
"GEQ", // >=
"EQL", // ==
"NEQ", // !=
"ASSIGN", // =
"SEMICN", // ;
"COMMA", // ,
"LPARENT", // (
"RPARENT", // )
"LBRACK", // [
"RBRACK", // ]
"LBRACE", // {
"RBRACE" // }
};
class SYMLIST :public CList<SYMBOL, SYMBOL>
{
};
SYMLIST DECLBEGSYS, STATBEGSYS, FACBEGSYS, CONSTBEGSYS, TYPEBEGSYS;
typedef enum NAMEKIND //标识符的种类的定义
{
KONSTANT, //常量
TYPEL, //无类型
VARIABLE, //变量
PROCEDURE //过程名
} OBJECT;
typedef enum VARTYPES //变量的类型的定义
{
NOTYP, //(暂时)没有类型
INTS, //整数类型
CHARS, //字符类型
BOOLS, //布尔类型
ARRAYS //数组类型
} TYPES;
typedef enum _OPCOD //操作码的定义
{
LIT, LIT1, LOD, ILOD, LODA, LODT, LODB, STO, CPYB, JMP, JPC, RED, WRT, _CAL, RETP, UDIS, OPAC, ENTP,
ENDP, ANDS, ORS, NOTS, IMOD, MUS, ADD, ADD1, SUB, _MULT, IDIV, EQ, NE, LS, LE, GT, GE
} OPCOD;
typedef struct _TYPEITEM //辅助节点定义
{
TYPES typ;
int ref;
} TYPEITEM;
typedef struct _CONSTREC
{
TYPES type;
int value;
} CONSTREC;
typedef struct SYMBOL_ITEM //从源文件读出的符号链表里面的节点的定义
{
int lineNumber; //符号所处的行数
SYMBOL type; //符号的类型
union SYMBOL_VALUE //根据不同的符号类型符号可以有不同的类型的值
{
int iValue; //如果是整数常量或者字符常量,则存放其值
char* lpValue; //如果是符号,则存放其首字符的地址
}value;
char* name;
struct SYMBOL_ITEM* next; //指向下一个节点
}SymbolItem;
typedef struct _INSTRUCTION //指令结构定义
{
int lineNumber;
OPCOD func;
int level;
int address;
} INSTRUCTION;
INSTRUCTION CODE[MAXNUMOFCODEADDRESS]; //指令数组定义
int CX; //指令数组索引
typedef struct _NAMETABITEM //名字表里面的纪录的定义
{
char name[MAXSYMNAMESIZE];
OBJECT kind;
TYPES type;
int level;// 表示标识符所在的作用域层级
int normal;// 用于标识是否为正常标识符(可能与错误或异常标识符区分)
int ref; // 引用计数,用于跟踪标识符的引用次数
union SYMBOL_VALUE //根据不同的符号类型符号可以有不同的类型的值
{
int value; //如果是整数常量或者字符常量,则存放其值
int size;
int address;
}unite;
int link;
//struct NAMETAB_ITEM *Next;
}NAMETABITEM;
NAMETABITEM NAMETAB[MAXNUMOFNAMETABLE]; //名字表定义
int TX; //名字表索引
typedef struct PROGRAM_BLOCK_ITEM //程序体表里的纪录的的定义
{
int lastPar; // 指向程序块的上一个参数的索引
int last;// 指向程序块的上一个局部变量的索引
int pSize;// 程序块的参数大小
int vSize;// 程序块的局部变量大小
//struct PROGRAM_BLOCK_ITEM *Next;
}BLOCKITEM;
BLOCKITEM BTAB[MAXNUMOFBLOCKTABLE]; //程序表定义
int BX; //程序体表索引
typedef struct ARRAY_INFORMATION_ITEM //数组信息表定义
{
TYPES intType;
TYPES eleType;
int low;
int high;
int elSize;
int size;
int elRef;
//struct ARRAY_INFORMATION_ITEM *Next;
}ARRAYITEM;
ARRAYITEM ATAB[MAXNUMOFARRAYTABLE]; //数组信息表定义
int AX; //数组信息表索引
int JUMADRTAB[300]; //跳转表的定义
int JX; //跳转表索引
int DISPLAY[MAXLEVELDEPTH]; //DISPLAY表定义
int displayLevel; //DISPLAY表的索引
int DX;//数据空间分配的指示器,每个程序体都要用到一次
//#include "global.h"
//#include "symlist.h"
char ObjCodeScript[GE + 1][1000] =
{
"LIT %4d ,%4d ------> 装入常量",
"LIT1 %4d ,%4d ------> 装入常量(用于计算数组元素地址)",
"LOD %4d ,%4d ------> 装入变量值",
"ILOD %4d ,%4d ------> 间接装入",
"LODA %4d ,%4d ------> 装入变量地址",
"LODT %4d ,%4d ------> 装入栈顶值为地址的内容",
"LODB %4d ,%4d ------> 装入长度为A的块",
"STO %4d ,%4d ------> 将栈顶值存入栈顶次值所指单元",
"CPYB %4d ,%4d ------> 传送长度为A的块",
"JMP %4d ,%4d ------> 无条件跳转",
"JPC %4d ,%4d ------> 栈顶值为0时跳转",
"READ %4d ,%4d ------> 读指令",
"WRITE %4d ,%4d ------> 写指令",
"CALL %4d ,%4d ------> 转子",
"RETP %4d ,%4d ------> 过程返回",
"UDIS %4d ,%4d ------> 调整Display",
"OPAC %4d ,%4d ------> 打开活动记录",
"ENTP %4d ,%4d ------> 进入过程",
"ENDP %4d ,%4d ------> 程序结束",
"AND %4d ,%4d ------> 与",
"OR %4d ,%4d ------> 或",
"NOT %4d ,%4d ------> 非",
"IMOD %4d ,%4d ------> 模",
"MUS %4d ,%4d ------> 求负",
"ADD %4d ,%4d ------> 加",
"ADD1 %4d ,%4d ------> 加(用于计算数组元素地址)",
"SUB %4d ,%4d ------> 减",
"MULT %4d ,%4d ------> 乘",
"IDIV %4d ,%4d ------> 除",
"EQ %4d ,%4d ------> ==",
"NEQ %4d ,%4d ------> !=",
"LSS %4d ,%4d ------> <",
"LEQ %4d ,%4d ------> <=",
"GTR %4d ,%4d ------> >",
"GEQ %4d ,%4d ------> >="
};