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