📄 pl0.h
字号:
#ifndef Pl0_h
#define Pl0_h
#pragma warning(disable: 4786) //skip VC6.0 problem with STL
#include <set>
#include <iostream>
#include <cstring>
#include <fstream>
#include <string>
using namespace std;
const int lineMaxLen=81;//缓冲区最大长度
const int numMaxLen = 14;//数字的最大位数
const int numReservedWord = 13;//保留字个数
const int levMax = 3;//最大嵌套层数
const int cxMax = 200;//目标代码存储区的最大长度
const int identMaxLen = 10;//标识符的最大长度
const int tableIndexMax = 100;//标识符说明表的最大长度
const int numMax = 2047;//允许的最大数
class Pl0 {
public:
Pl0(char *fileName, bool debugOn, bool outputOn); //打开文件
~Pl0(); //关闭文件
void listCode(int codeIndex0);//输出目标代码
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
,DOSYM,CALLSYM,CONSTSYM,VARSYM,PROCSYM,WRITESYM,READSYM};//单词类型
typedef set<symbol> symset;
symset declbegsys, statbegsys, facbegsys;
void getsym(); //词法分析
void block(symset fsys,int tableIndex, int lev);//语法分析及目标代码生成
void interpret();//目标代码解释执行
int getError();
void printTable();
private:
ifstream fin;
ofstream out;
ofstream debugOut;
bool sourceEnd;//标识文件尾
char ch;
char lineBuffer[lineMaxLen];//缓冲区
int lineNum;//行数
int lineLen;//行字节数
int charCount;//当前已读字符数
int errorCount;//错误数
char id[13];
int codeIndex; //目标代码下标
int number;
char token[18];
char word[23][18]; //保存保留字
static string errorInfo[];//错误信息
int lastIdentLen;//上一个标字符长度
int tablenum;
enum fct {LIT,OPR,LOD,STO,CAL,INT,JMP,JPC};//目标代码类型
symbol sym;
symbol wsym[18];
symbol ssym[100];
struct instruction{ //保存生成的P-CODE指令代码
fct func;//操作类型
int lev;//所在层数
int addr;//层内偏移量
};
instruction code[cxMax+1];
enum object {CONSTANT,VARIABLE,PROCEDURE};//标字符类型
struct Table{ //最大符号表,冗余大,造成空间浪费
char name[13];//标识符名
object kind;//标识符类型
int level;//层数
int addr;//层内偏移量
int val;//标识符的值
};
Table table[tableIndexMax+1];//登记标识符的table表
char mnemonic[10][6];//存储目标代码类型
void getch();//取单个字符
void error(int i);//输出错误信息
void gen(fct x, int y, int z);//生成目标代码
void enter(object kind, int &tableIndex,int &dataIndex, int &lev);//登记标识符
int position(char *id, int tableIndex);//检测标识符在符号表的位置
void test(symset s1, symset s2, int n);//
void constDeclaration(int &tableIndex, int &dataIndex, int &lev);//常量声明
void varDeclaration(int &tableIndex, int &dataIndex, int &lev);//变量声明
//void listCode(int codeIndex0);//输出目标代码
void statement(symset fsys,int tableIndex, int lev);//语句
void expression(symset fsys,int tableIndex, int lev);//表达式
void term(symset fsys,int tableIndex, int lev);//项
void factor(symset fsys,int tableIndex, int lev);//因子
void condition(symset fsys,int tableIndex, int lev);//条件
void block1(symset fsys,int tableIndex, int lev);//语法分析及目标代码生成
int base(int base,int* store,int l);
void OUTPUT(char *msg, int i);
void OUTPUT(char *msg1, char *msg2, int i, int j, int k);
void DEBUG(int into, char *msg, char c = ' ');
void DEBUG(int into, char *msg, int i, int j = 99999);
int counter;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -