📄 global.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 + -