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

📄 pl0parser.h

📁 编译方法实验根据编译器的工作过程
💻 H
字号:
// Pl0Parser.h: interface for the CPl0Parser class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_PL0PARSER_H__5AADA4FC_06A1_41DD_8D8E_534E0A244A49__INCLUDED_)
#define AFX_PL0PARSER_H__5AADA4FC_06A1_41DD_8D8E_534E0A244A49__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

const STRBUFLEN=10240;
const TABLELEN=1024;
const MAXCODELEN=50000;

enum{					//符号类别
	SERVERKEY,FACTOR,ROP,ENDF,
	MCONST,VAR,PROCEDURE,CALL,BEGIN,END,IF,THEN,WHILE,DO,READ,WRITE,ODD,
	DOT,COMMA,SEMICOLON,LPAREN,RPAREN,ASSIGNOP,PLUSOP,MINUSOP,MULTOP,DIVOP,GT,GE,LT,LE,EQ,NE,
	CONSTANT,VARIABLE,IDENT,NUMBER
};

enum{
	ERR_NUN,ERR_UNGETC,ERR_NE,ERR_EXP,ERR_ROP
};

struct SymbolTable		//符号表结构
{
	const char *pName;	//符号名称
	int  kind;			//符号类别
	int  val;			//符号值
	int	 level;			//符号的层数
	int	 parent;		//符号的作用域
	int  size;			//过程长度
};

struct KeyWord			//保留字表结构
//一保留字或分隔符、运算符一个类别
{
	char *pName;		//保留字名称
	int	 kind;			//保留字类别
};

struct CodeStruc
{
	char code[5];		//指令代码
	int  level;			//层数
	int  addr;			//地址
};

class CPl0Parser;
class CPl0Execute;

class CPl0Code
{
	friend CPl0Execute;
public:
	void intit(CPl0Parser *p);
	int gen(char code[],int lev,int addr);	//生成指令,格式:code,lev,addr
	void modify(int pos,int tg);			//转移到tg处
	void modify(int pos);					//转移到当前处
	int getCodeAddr();
	void getCode(CString & cds);
	CodeStruc codes[MAXCODELEN];
private:
	CPl0Parser *pParser;
	int curCodePosition;
};

class CPl0Parser  
{
	friend CPl0Code;
public:
	CPl0Parser();
	virtual ~CPl0Parser();

	void pl0(const char *p);
	void getCode(CString & cds);
	void Execute(const char *p);
private:
	//识别的单词
	int tokKind,tokVal;
	const char *token;

	//符号表及符号堆、层次信息、源程序
	const char *pCurPosition;
	char stringBuf[STRBUFLEN],*pStrBuf;;
	SymbolTable table[TABLELEN];
	int curLev,curParent;

	//启动代码地址
	int stCode;

	//词法分析函数
	void NextToken();
	void match(int kind);
	char Getch();
	void unGetch();
	void getID();
	void getNum();

	//符号表操作函数
	int lookUp(const char *p);
	int getParent();
	int fillTable(int kind);

	//语法分析函数
	void program();
	void word();
	void constPart();
	void varPart();
	void procedure();
	void assignWord();
	void callWord();
	void beginWord();
	void ifWord();
	void whileWord();
	void readWord();
	void writeWord();
	void expression();
	void condition();
	void term();
	void factor();

	//内存分配
	int addr;

	//出错处理
	void error(const char *errMsg);
	void error(int kind);
	void errExp();
	int lineNo;
	int bookLine;
	void bookMark()
	{
		bookKind=tokKind;
		bookStr=pCurPosition;
		bookLine=lineNo;
	}
	void retMark()
	{
		tokKind=bookKind;
		pCurPosition=bookStr;
		lineNo=bookLine;
	}
	void back()
	{
		while(1)
		{
			switch(*pCurPosition)
			{
			case '\n':
				lineNo--;
			case ' ':
			case '\t':
				pCurPosition--;
				continue;
			default:
				break;
			}
			break;
		}
		pCurPosition-=strlen(token);
	}
	int bookKind;
	const char *bookStr;

	//代码生成
	CPl0Code code;

	int errOp,errFlag;
	CString errStr;
};

class CPl0Execute
{
public:
	void init(CPl0Code *p);
	void Execute();
private:
	CPl0Code *pCode;
	int	stack[2048],sp;
	int BX;
	int IP;

	int b;

	void LIT(int a);
	void LOD(int l,int a);
	void STO(int l,int a);
	void CALL(int l,int a);
	void INT(int a);
	void JMP(int a);
	void JPC(int a);
	void OPR(int a);

	CString OutPut,InPut;
	const char *pInPos;
};
#endif // !defined(AFX_PL0PARSER_H__5AADA4FC_06A1_41DD_8D8E_534E0A244A49__INCLUDED_)

⌨️ 快捷键说明

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