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

📄 pl0.h

📁 c++语言编写的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 + -