⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 global.h

📁 用VC写的扩充的pl0文法编译器
💻 H
字号:
#ifndef _GLOBAL_H_
#define _GLOBAL_H_

#include<vector>
#include<iostream>
#include<fstream>
#include<set>
#include<map>
#include<string>
#include<iomanip>
#include<stdio.h>
using namespace std;


//常量定义
const int norw=21;//保留字个数
const int txmax=200;//符号表的长度
const int bxmax=100;//分程序索引表的长度
const int nmax=6;//数字允许的最长位数
const int al=10;//标识符最长长度
const int amax=2047;//寻址空间
const int levmax=4;//最大允许的块嵌套层次
const int cxmax=200;//类PCODE目标代码数组长度
const int nsym=11;
const int tsmax=200;//字符串数组的最长长度
const int stacksize=500;


//类型定义
 enum SYMBOL  { NUL,IDENT,INTSYM,REALSYM,CHARSYM,STRING,CNUM,INUM,RNUM,PLUS,MINUS,TIMES,SLASH,
                EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN,RPAREN,COMMA,
			    SEMICOLON,PERIOD,BECOMES,BEGINSYM,ENDSYM,
			    IFSYM,THENSYM,ELSESYM,WHILESYM,DOSYM,
			    FORSYM,DOWNTOSYM,TOSYM,WRITESYM,READSYM,REPEAT,UNTIL,
			    CONSTSYM,VARSYM,PROCSYM,FUNCSYM,COLON,ODDSYM
 };
			  
typedef set<SYMBOL> SYMSET;
typedef char ALFA[al+1];

enum OBJ {CONSTANT,VARIABLE,PROCEDURE,FUNCTION,PARAMETER};
enum TYP {notyp,chars,ints,reals};
enum FCT {Lit,Opr,Lod,Lodf,Loda,Sto,Stoi,Int,Jmp,Jpc,Red,Wrt,Wrts,Cal,F1U,F2U,F1D,F2D,Fun,Stof};
struct INSTRUCTION
{
	FCT f;
	float l;//层次level
	float a;//displacement addr 转移代码
};

struct TABLE
{
	ALFA name;
	int link;
	OBJ kind;
	TYP type;
	int level;
	float val;
	int adr;
	int ref;
};
struct BTAB
{
	int last;
	int lastpar;
	int psize;
	int vsize;
};
struct ITEM
{
	TYP typ;
	int ref;
};
class PL0
{
public:
	PL0(const char*,const char*);
	~PL0();
	void Error(int n,int line);
	void Error(string s,int line);
	void Warning(string s,int line);
	int Getch();
	int Getsym();
	int Position(ALFA id,int lev);
    void Gen(FCT x,float y,float z);
	void Test(SYMSET s1,SYMSET s2,int n);
	void Test(SYMSET s1,SYMSET s2,string s);
	void Enter(OBJ k,int &tx,int &dx,int lev);
	//void Entertyp(TYP t);
	void Constdeclaration(int &tx,int &dx,int lev);
	void Vardeclaration(int &tx,int &dx,int lev);
	void Procdeclaration(int &tx,int &dx,int lev,SYMSET &fsys);
	void Statement(SYMSET fsys,int lev);
	void Call(SYMSET fsys,int i,int lev);
	void Condition(SYMSET fsys,ITEM &x,int lev);
	TYP Resulttype(TYP a,TYP b);
	void Listcode();
	void Block(bool isfun,int lev,SYMSET fsys);
	void Interpret();
	int Base(int l,int b,float* s);
	void Parameterlist(int &tx,int &dx,int lev);
	void Enterblock(int &bx);
	bool sourceEnd;
	void PrintTable(int &tx);
	void PrintBtab(int &bx);
	void PrintDisplay();
	//----------------------------------------------------语句处理函数--------------------------------------//
	void Assignment(SYMSET fsys,int lv,int ad,int po);//赋值语句
	void Compoundstatement(SYMSET fsys,int lev);
	void Expression(SYMSET fsys,ITEM &x,int lev);
	void Term(SYMSET fsys,ITEM &x,int lev);
	void Factor(SYMSET fsys,ITEM &x,int lev);
	
	int tx;
	int err;//错误计数器

protected:
	int DISPLAY[10];//分程序索引表
	bool listswitch;//如果本变量值为true,程序编译后将列出类PCODE代码
    char ch;//主要用于词法分析器,存放最近一次从文件中读出的字符
    SYMBOL sym;//词法分析器输出结果之用,存放最近一次识别出来的标识符的名字
	ALFA id;
	float num;
	//int err;
	int sentry;
	int slength;
	int sleng;
	int bx;
	//int tx;
	int linecount;//行计数器
    int cc; //行缓冲区指针
    int ll;//行缓冲区长度
    int kk;//引入此变量是出于程序性能的考虑,见getsym函数注释
    int cx;//代码分配指针,代码生成模块总在cx所指位置生成新的代码
    char line[101];//行缓冲区,用于从文件中读出一行,供词法分析获取单词之用 
    ALFA a;//词法分析器中用于临时存放正在分析的词
	float s[stacksize];//运行栈
    INSTRUCTION code[cxmax];//生成的类PCODE代码表,存放编译得道的类PCODE代码
    ALFA word[norw+1];//保留字表
	char str[tsmax];
    SYMBOL wsym[norw+1];//保留字表中每一个保留字对应的symbol类型
    SYMBOL ssym[nsym];//一些符号对应的symbol类型表
	SYMSET declbegsys,facbegsys,statbegsys;
	vector<string> errorMESS;
    map<SYMBOL,string> word_Type;
	map<TYP,string>typmap;
	map<OBJ,string>objmap;
	map<FCT,string>fctmap;
	char  mnemonic[8][6];
	struct TABLE table[txmax];
	struct BTAB btab[bxmax];
	FILE *fin,*fout;

	
private:

	inline void Int_error();
	inline void Int_word();
	inline void Int_ssym();
	inline void Int_mnemonic();
	inline void Int_wsym();
	inline void Word_type();
	inline void Typmap();
	inline void Objmap();
	inline void Fctmap();
	bool ret;
};


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -