?? pl0.h
字號(hào):
#define NKEY 13 //關(guān)鍵字個(gè)數(shù)
#define TXMAX 100 //名字表最大長(zhǎng)度
#define NMAX 14 //number的最大位數(shù)
#define WMAX 10 //符號(hào)最大長(zhǎng)度
#define AMAX 2047 //數(shù)的上界
#define LVMAX 3 //最多嵌套層數(shù)
#define CXMAX 1000 //虛擬機(jī)代碼表最大長(zhǎng)度
#define SYMNUM 32 //符號(hào)個(gè)數(shù)
#define FCTNUM 8 //虛擬機(jī)指令個(gè)數(shù)
#define STACKSIZE 500 //解釋執(zhí)行的棧
enum sbl{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};
enum obj{constant,variable,procedure};
enum fct{lit,opr,lod,sto,cal,inte,jmp,jpc};
struct ins
{
enum fct f; //虛擬機(jī)指令
int l; //引用層與聲明層層次差
int a; //隨f不同而不同
};
struct ins code[CXMAX]; //虛擬機(jī)代碼表
struct table
{
char name[WMAX]; //名
enum obj kind; //類(lèi)型
int val; //僅常數(shù)用的數(shù)值
int lev; //所在層,僅常數(shù)不用
int adr; //地址,僅常數(shù)不用
int size; //需分配的數(shù)據(jù)區(qū)空間,僅過(guò)程使用
};
struct table tb[TXMAX];
FILE *fa; //輸出虛擬機(jī)代碼
FILE *fa1; //輸出源文件及各行對(duì)應(yīng)首地址
FILE *fa2; //輸出結(jié)果
FILE *fin;
FILE *fout;
char fname[WMAX];
int err; //錯(cuò)誤計(jì)數(shù)器
char ch;
enum sbl sym; //當(dāng)前符號(hào)
char id[WMAX]; //當(dāng)前ident,多一字節(jié)存0
char tmp[WMAX]; //臨時(shí)符號(hào),多一字節(jié)存0
int num; //當(dāng)前number
int cc,ll; //取字符計(jì)數(shù)器,ll是取一行的字符數(shù)
int cx; //虛擬機(jī)代碼指針,取值[0,CXMAX-1]
char line[81]; //讀一行的緩沖區(qū)
char word[NKEY][WMAX]; //關(guān)鍵字
enum sbl wsym[NKEY]; //關(guān)鍵字對(duì)應(yīng)的符號(hào)值
enum sbl ssym[256]; //單字符對(duì)應(yīng)的符號(hào)值
char mc[FCTNUM][5]; //虛擬機(jī)代碼名稱(chēng)
int dcbsys[SYMNUM]; //聲明開(kāi)始符號(hào)集的表示
int stbsys[SYMNUM]; //語(yǔ)句開(kāi)始符號(hào)集的表示
int fcbsys[SYMNUM]; //因子開(kāi)始符號(hào)集的表示
char errinfo[][40]={"數(shù)的位數(shù)過(guò)多",
"過(guò)程嵌套最多允許三層",
"常量聲明漏了分號(hào)",
"變量聲明漏了分號(hào)",
"過(guò)程聲明漏分號(hào)",
"procedure后應(yīng)為標(biāo)識(shí)符",
"子過(guò)程結(jié)尾漏了分號(hào)",
"數(shù)越界",
"過(guò)程說(shuō)明后應(yīng)為語(yǔ)句開(kāi)始符或過(guò)程定義符",
"應(yīng)為語(yǔ)句開(kāi)始符",
"程序體內(nèi)語(yǔ)句部分的后跟符不正確",
"常量說(shuō)明中“=”寫(xiě)成了“:=”",
"常量說(shuō)明中“=”后應(yīng)為數(shù)字",
"常量說(shuō)明中標(biāo)識(shí)符后應(yīng)為“=”",
"const后應(yīng)為標(biāo)識(shí)符",
"var后應(yīng)為標(biāo)識(shí)符",
"標(biāo)識(shí)符未聲明",
"賦值語(yǔ)句中賦值號(hào)左部標(biāo)識(shí)符應(yīng)為變量",
"賦值語(yǔ)句缺少賦值號(hào)",
"read后應(yīng)為左括號(hào)",
"read()中變量未聲明",
"read()中應(yīng)為變量",
"read最后應(yīng)為右括號(hào)",
"write最后應(yīng)為右括號(hào)",
"write后應(yīng)為左括號(hào)",
"call中過(guò)程未聲明",
"call后應(yīng)為過(guò)程名",
"call后應(yīng)為標(biāo)識(shí)符",
"if語(yǔ)句缺少then",
"復(fù)合語(yǔ)句中語(yǔ)句之間缺少分號(hào)",
"復(fù)合語(yǔ)句缺少end",
"while語(yǔ)句缺少do",
"語(yǔ)句后符號(hào)不正確",
"因子開(kāi)始符不正確",
"因子中標(biāo)識(shí)符未聲明",
"因子中表示符不能為過(guò)程",
"因子缺少右括號(hào)",
"因子后有非法符號(hào)",
"應(yīng)為關(guān)系運(yùn)算符",
"程序結(jié)尾缺少句號(hào)"};
void error(int n); //報(bào)錯(cuò)
int getsym(); //取單詞
int getch(); //取字符,兼輸出源代碼
void init(); //初始化
int gen(enum fct x,int y,int z); //生成虛擬機(jī)代碼
int test(int *s1,int *s2,int n); //作為布爾值使用,下同
int inset(int e,int *s); //求s[e]
int addset(int *sr,int *s1,int *s2,int n); //求并集
int subset(int *sr,int *s1,int *s2,int n); //求差集
int mulset(int *sr,int *s1,int *s2,int n); //求交集
int mb(int lev,int tx,int *s); //語(yǔ)法語(yǔ)義及代碼生成
void itp(); //解釋執(zhí)行程序
int fac(int *ptx,int *s,int lev); //因子處理
int term(int *ptx,int *s,int lev); //項(xiàng)處理
int con(int *ptx,int *s,int lev); //條件處理
int exp(int *ptx,int *s,int lev); //表達(dá)式處理
int stat(int *ptx,int *s,int lev); //語(yǔ)句處理
int vardc(int *ptx,int lev,int *pdx); //變量聲明
int constdc(int *ptx,int lev,int *pdx); //常量聲明
int extable(char *idt,int tx); //查詢名字表,檢查變量定義否
void record(enum obj k,int *ptx,int lv,int *pdx); //在名字表中記錄新數(shù)據(jù)
int base(int l,int *x,int b);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -