?? lin.h
字號:
/* 關鍵字個數 */
#define norw 15
/* 名字表容量 */
#define txmax 100
/* 所有的add1用于定義數組 */
#define txmaxadd1 101
/* number的最大位數 */
#define nmax 14
/* 符號的最大長度 */
#define al 10
/* 地址上界 */
#define amax 2047
/* 最大允許過程嵌套聲明層數 */
#define levmax 3
/* 最多的虛擬機代碼數 */
#define cxmax 200
#define cxmaxadd1 201
/* 當函數中會發生fatal error時,返回-1告知調用它的函數,最終退出程序 */
#define getsymdo if(-1==getsym())return -1
#define getchdo if(-1==getch())return -1
#define conditiondo(a,b,c) if(-1==condition(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
//typedef enum{Isfalse,Isture} ESC_BOOL;
/* 符號 */
enum symbol {nul,ident,number,plus,minus,times,slash,oddsym,eql,neq,lss,leq,gtr,geq,lparen,rparen,comma,colon,semicolon,period,becomes,beginsym,endsym,ifsym,thensym,whilesym,andsym,readsym,dosym,repeatsym,constsym,varsym,procsym,untilsym,elsesym};
#define symnum 32
/* 名字表中的類型 */
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; /* 根據f的不同而不同 */
};
struct codeid
{
char a;
char x[al];
char y[al];
char z[al];
char w[al];
char b;
char c;
char d;
};
FILE* fa1; /* 輸出源文件及其各行對應的首地址 */
bool listswitch; /* 顯示虛擬機代碼與否 */
bool tableswitch; /* 顯示名字表與否 */
char ch; /* 獲取字符的緩沖區,getch 使用 */
enum symbol sym; /* 當前的符號 */
char id[al]; /* 當前ident */
int i=0;
int num; /* 當前number */
int cc,ll,kk; /* getch使用的計數器,cc表示當前字符(ch)的位置 */
int cx; /* 虛擬機代碼指針 */
int dx=0;/*輸出序列號*/
int z=1;/*Ti*/
int re;/*回填數字*/
char line[81]; /* 讀取行緩沖區 */
char a[al]; /* 臨時符號 */
char b[al];
char e[al];
struct instruction code[cxmaxadd1]; /* 存放虛擬機代碼的數組 */
struct codeid cd[cxmax];
char word[norw][al]; /* 保留字 */
enum symbol wsym[norw]; /* 保留字對應的符號值 */
enum symbol ssym[256]; /* 單字符的符號值 */
char mnemonic[fctnum][5]; /* 虛擬機代碼指令名稱 */
bool declbegsys[symnum]; /* 表示聲明開始的符號集合 */
bool statbegsys[symnum]; /* 表示語句開始的符號集合 */
bool facbegsys[symnum]; /* 表示因子開始的符號集合 */
char record[al];/*記錄數組*/
/* 名字表結構 */
struct tablestruct
{
char name[al]; /* 名字 */
enum object kind; /* 類型:const,var or procedure */
int val; /* 數值,僅const使用 */
int level; /* 所處層,僅const不使用 */
int adr; /* 地址,僅const不使用 */
int size; /* 需要分配的數據區空間,僅procedure使用 */
};
struct tablestruct table[txmaxadd1]; /* 名字表 */
FILE* fin;
FILE* fout;
char fname[al];
int err; /* 錯誤計數器 */
void error(int n);
int getsym();
int getch();
void init();
int block(int lev,int tx,bool* fsys);
char factor(bool* fsys,int* ptx,int lev);
char term(bool* fsys,int* ptx,int lev);
int condition(bool* fsys,int* ptx,int lev);
char expression(bool* fsys,int* ptx,int lev);
int statement(bool* fsys,int* ptx,int lev);
int gen(char[],char[],char[],char[]);
int vardeclaration(int* ptx,int lev,int* pdx);
int constdeclaration(int* ptx,int lev,int* pdx);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -