?? 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 + -