?? 編譯大作業.h
字號:
//33060509 黃昭銳 編譯大作業
//聲明部分
#define NROW 16 //關鍵字個數
#define TXMAX 100 //名字表容量
#define NMAX 14 //number的最大位數
#define AL 10 //符號的最大長度
#define AMAX 2047 //地址上界
#define LEVMAX 4 //最大允許過程嵌套聲明層數[0,levmax]
#define CXMAX 200 //最多的虛擬機代碼數
#define STACKSIZE 500 //堆??臻g
//符號
enum symbol{nul, //空
ident, number, //類型
plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen,
rparen, comma, semicolon, period, becomes, //符號
beginsym, endsym, ifsym, thensym, whilesym, writesym, readsym, dosym, //關鍵字
callsym, constsym, varsym, procsym, elsesym};
#define symnum 33 //符號數目
//名字表中的類型
enum object{constant,variable,procedur};
//虛擬機代碼
enum fct{lit, opr, lod, sto, cal, inte, jmp, jpc};
#define fctnum 8 //虛擬機代碼數目
//虛擬機代碼結構
struct instruction
{
enum fct f; //虛擬機代碼指令
int l; //引用層與聲明層的層次差
int a; //具體參考解釋程序
};
FILE *fas; //輸出名字表
FILE *fa1; //輸出源文件及各行對應首地址
FILE *fa2; //輸出結果
bool listswitch; //顯示虛擬機代碼的標志位
bool tableswitch; //顯示名字表的標志位
char ch; //獲取字符
enum symbol sym; //當前符號
char id[AL+1]; //記錄當前標示符
int num; //當前數值
int cc,ll; //getch使用計數器
int cx; //虛擬機代碼
char line[81]; //行緩沖區
char a[AL+1]; //臨時符號
struct instruction code[CXMAX]; //存放虛擬機代碼數組
char word[NROW][AL]; //保留字
enum symbol wsym[NROW]; //保留字對應符號值
enum symbol ssym[256]; //字符符號值
char mnemonic[fctnum][5]; //虛擬機代碼指令名稱
bool declbegsys[symnum]; //聲明開始符號集合
bool statbegsys[symnum]; //語句開始符號集合
bool facbegsys[symnum]; //因子開始符號集合
//名字表結構
struct tablestruct
{
char name[AL]; //名字
enum object kind; //類型
int val; //數值
int level; //所出層
int adr; //地址
int size; //分配數據區空間
};
struct tablestruct table[TXMAX]; //名字表
FILE *fin; //輸入文件指針
FILE *fout; //輸出文件指針
char fname[AL]; //記錄源文件的地址
int err; //錯誤計數器
//各函數宏定義
#define getsymdo if(-1==getsym())return -1
#define getchdo if(-1==getch())return -1
#define testdo(a,b,c) if(-1==test(a,b,c))return -1
#define gendo(a,b,c) if(-1==gen(a,b,c))return -1
#define expressiondo(a,b,c) if(-1==expression(a,b,c))return -1
#define factordo(a,b,c) if(-1==factor(a,b,c))return -1
#define termdo(a,b,c) if(-1==term(a,b,c))return -1
#define conditiondo(a,b,c) if(-1==condition(a,b,c))return -1
#define statementdo(a,b,c) if(-1==statement(a,b,c))return -1
#define constdeclarationdo(a,b,c) if(-1==constdeclaration(a,b,c))return -1
#define vardeclarationdo(a,b,c) if(-1==vardeclaration(a,b,c))return -1
void error(int n); //出錯程序
int getsym(); //讀符號
int getch(); //讀字符
void init(); //初始化
int gen(enum fct x,int y,int z); //生成P代碼
int test(bool *s1,bool *s2,int n); //測試后續符號
int inset(int e,bool *s); //集合操作
int addset(bool *sr,bool *s1,bool *s2,int n);
int subset(bool *sr,bool *s1,bool *s2,int n);
int mulset(bool *sr,bool *s1,bool *s2,int n);
int block(int lev,int tx,bool *fsys); //分程序
void interpret(); //解釋程序
int factor(bool *fsys,int *ptx,int lev); //因子
int term(bool *fsys,int *ptx,int lev); //項
int condition(bool *fsys,int *ptx,int lev); //條件
int expression(bool *fsys,int *ptx,int lev); //表達式
int statement(bool *fsys,int *ptx,int lev); //語句
void listcode(int cx0); //輸出目標代碼清單
int vardeclaration(int *ptx,int lev,int *pdx); //變量聲明
int constdeclaration(int *ptx,int lev,int *pdx); //常量聲明
int position(char *idt,int tx); //名字定位
void enter(enum object k,int *ptx,int lev,int *pdx); //填入名字表
int base(int l,int *s,int b); //求基址
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -