SNL语言-吉大计算机编译原理课程设计文档格式.doc
《SNL语言-吉大计算机编译原理课程设计文档格式.doc》由会员分享,可在线阅读,更多相关《SNL语言-吉大计算机编译原理课程设计文档格式.doc(44页珍藏版)》请在冰点文库上搜索。
TypeIR * idType;
IdKind kind;
unionMore
struct
{
AccessKind access;
int level;
int offset;
}VarAttr;
int level;
ParamChain * param;
int code;
int size;
}ProcKind;
};
structSymbolChain
int line;
char idName[10];
AttributeIR attrIR;
SymbolChain* next;
};
classanalyze
private:
TreeNode * root;
int level;
SymbolChain * Scope[ScopeMaxLevel];
SymbolChain* Backup[ScopeMaxLevel];
private:
ofstream output;
analyze(ofstreamo,TreeNode*r);
~analyze();
voidPrintSymbolChain();
boolFindField();
boolSearchChain(char*,int,SymbolChain*&
);
boolFindEntry(char*,bool,SymbolChain*&);
boolFindEntry2(char*,SymbolChain*&,IdKind);
boolEnter(char*,SymbolChain*&
voidDestroyChain();
voidCreateChain();
voidanalysis(TreeNode*);
public:
voidRecordType(TreeNode*t,SymbolChain*entry);
voidArrayType(TreeNode*t,SymbolChain*entry);
voidnameType(TreeNode*t,SymbolChain*entry);
SymbolChain*NewTy();
voidTypeProcess(TreeNode*t,SymbolChain*);
voidBody(TreeNode*t);
voidProcDecPart(TreeNode*t);
voidVarDecPart(TreeNode*t);
voidTypeDecPart(TreeNode*t);
staticvoiddoAnalyze(TreeNode*,ofstream);
#endif
/*parse。
#ifndef_PARSE_H_
#define_PARSE_H_
#include"
TokenList。
#include”TreeNode.h"
classparse{
ofstream *output;
TokenList *head;
TokenList *cur;
TreeNode *root;
voidfieldvarMore(TreeNode*t);
TreeNode*fieldvar();
voidvariMore(TreeNode*t);
TreeNode*variable();
TreeNode*factor();
TreeNode*term();
TreeNode*Simple_exp();
TreeNode*Exp();
TreeNode*ActParamMore();
TreeNode*ActParamList();
TreeNode*CallStmRest();
TreeNode*ReturnStm();
TreeNode*OutputStm();
TreeNode*InputStm();
TreeNode*LoopStm();
TreeNode*ConditionalStm();
TreeNode*ArrayRest();
TreeNode*FieldRest();
TreeNode*AssignmentRest();
TreeNode*AllCall();
TreeNode*Stm();
TreeNode*StmMore();
TreeNode*StmList();
TreeNode*ProgramBody();
TreeNode*procBody();
TreeNode*ProcDecPart();
voidFidMore(TreeNode*t);
voidFormList(TreeNode*t);
TreeNode*Param();
TreeNode*ParamMore();
TreeNode*ParamDecList();
voidParamList(TreeNode*t);
TreeNode*ProcDeclaration();
TreeNode*ProcDec();
voidvarIdMore(TreeNode*t);
voidVarIdList(TreeNode*t);
TreeNode*VarDecMore();
TreeNode*VarDecList();
TreeNode*VarDeclaration();
TreeNode*VarDec();
voidIdMore(TreeNode*t);
voidIdList(TreeNode*t);
TreeNode*FieldDecMore();
TreeNode*FieldDecList();
voidRecType(TreeNode*t);
voidArrayType(TreeNode*t);
voidStructureType(TreeNode*t);
voidBaseType(TreeNode*t);
voidTypeDef(TreeNode*t);
voidTypeId(TreeNode*t);
TreeNode*TypeDecMore();
TreeNode*TypeDecList();
TreeNode*TypeDeclaration();
TreeNode*TypeDec();
TreeNode*DeclarePart();
TreeNode*DeclarePart2();
TreeNode*ProgramHead();
TreeNode*Program();
ofstream*getOutputStream();
TokenList*getCur();
TokenList*getHead();
char*getNextTokenSem();
char*getCurrentTokenSem();
voidsetCur(TokenList*t);
voidsetOutputStream(ofstream*o);
voidsetHead(TokenList*t);
boolread();
boolmatchSem(constchar[]);
boolmatchLex(LexTypel);
boolmatchNextLex(LexTypel);
boolmatchNextSem(constchars[]);
LexTypegetNextTokenLex();
LexTypegetCurTokenLex();
parse(TokenList*,ofstream*);
~parse();
voidprintTree(TreeNode*root);
intgetCurrentTokenLineNO();
public:
staticTreeNode*doParse(TokenList*,ofstream*);
/*scan.h*/
#ifndef_SCAN_H_
#define_SCAN_H_
#include"
classscan
staticTokenList*doScan(ifstream*,ofstream*);
ifstream*inputFile;
ofstream*outputFile;
scan();
scan(ifstream*,ofstream*);
~scan();
ifstream*getInputFile();
ofstream*getOutputFile();
voidsetInputFile(ifstream*);
voidsetOutputFile(ofstream*);
voidclearArray();
chargetNextChar();
LexTypelookup(char*);
TokenList*getTokenList();
voidprintTokenList(TokenList*);
/*Token.h*/
#ifndef_TOKEN_H_
#define_TOKEN_H_
#include〈iostream〉
#include<
fstream〉
usingnamespacestd;
enumLexType{
ID, //标识符
CHARC, //字符串
RESERVEDWORD, //保留字
INST, //整型常量符
OP, //运算符
ASSIGN, //赋值运算符
DELIMITER, //分界符
RANGE, //数组下标
POINTER, //结构类型成员运算符
DOT, //程序结束标志
ENDFILE, //文件结束标志
ERROR, //错误符号
};
classToken
Token();
Token(int,char*,LexType);
~Token();
void printToken(ofstream*);
void printToken1();
void setLex(LexType);
void setSem(char*);
void setLine(int);
int getLine();
LexTypegetLex();
char* getSem();
int line;
char* sem;
LexType lex;
/*TokenList.h*/
#ifndef_TOKENLIST_H_
#define_TOKENLIST_H_
#include"
Token.h"
classTokenList{
TokenList();
~TokenList();
void setToken(Token*);
void setNext(TokenList*);
void setNumber(int);
int getNumber();
Token*getToken();
TokenList*getNext();
void append();
intnumber;
Token*token;
TokenList*next;
/*Treenode。
#ifndef_TREENODE_H_
#define_TREENODE_H_
#include〈string>
#include〈iostream〉
#include〈fstream〉
enumNODE_KIND //语法树节点
ProK, //根标志
PheadK, //程序头
TypeK, //类型声明
VarK, //变量声明
ProcDecK, //单个过程声明
StmLK, //语句序列
DecK, //声明节点
StmtK, //语句节点
ExpK //表达式节点
//********************************************************
enumDEC_KIND //具体声明
ArrayK, //数组
CharK, //字符
IntegerK, //整型
RecordK, //记录
IdK //Type定义的类型
enumSTMT_KIND //具体语句
IfK, //if语句
WhileK, //while语句
AssignK, //赋值语句
ReadK, //read语句
WriteK, //write语句
CallK, //过程调用语句
ReturnK //返回语句
enumEXP_KIND //具体表达式
OpK, //操作符
ConstK, //常整型
IdEK, //标识符
ArrayEK, //数组
FieldEK, //域
CHAREK //单字符
unionKIND//记录语法树节点具体类型
DEC_KIND dec;
//声明
STMT_KIND stmt;
//语句
EXP_KIND exp;
//表达式
//*****************************************************************
enumPARAM_TYPE//过程参数属性
valparamtype,//值参
varparamtype//变参
enumEXP_OP_TYPE//表达式运算符类型
LT,
EQ,
PLUS,
MINUS,
TIMES,
OVER
structArrayAttr//数组属性
intlow;
//上界
intup;
//下届
DEC_KINDchildType;
//类型
structProcAttr//过程属性
PARAM_TYPEparamtype;
structExpAttr//表达式属性
EXP_OP_TYPEop;
intval;
structAttr//属性
ArrayAttrarrayattr;
ProcAttrprocattr;
ExpAttrexpattr;
classTreeNode
NODE_KIND nodekind;
TreeNode* child[3];
TreeNode* sibling;
char *idname[3];
int lineno;
KIND kind;
char *type_name;
Attr attr;
int idnum;
int childnum;
//设置表达式属性*****************************************************
voidsetAttrExpVal(inti);
voidsetAttrExpOpType(char*s);
EXP_OP_TYPEgetAttrExpOpType();
//设置过程属性*******************************************************
voidsetProcAttrParamType(PARAM_TYPEd);
//设置数组属性*******************************************************
voidsetArrayAttrType(DEC_KINDd);
voidsetArrayAttrUp(intu);
voidsetArrayAttrLow(intl);
voidsetLineNo(intl);
voidsetNodeKind(NODE_KINDn);
voidsetTypeName(char*s);
voidsetIdName(char*s);
voidsetChild(inti,TreeNode*c);
voidsetChild(TreeNode*);
voidsetSibling(TreeNode*t);
void setKindOfDec(DEC_KIND);
DEC_KIND getKindOfDec();
void setKindOfStmt(STMT_KIND);
void setKindOfExp(EXP_KIND);
TreeNode* getSibling();
TreeNode* getChild(inti);
int getIdNum();
char * getIdName(inti);
~TreeNode();
TreeNode();
TreeNode(NODE_KINDn);
voidprintTreeNode();
voidprintTreeNode(ofstream*out);
#endif
/*zparse.h*/
#ifndef_ZPARSE_H_
#define_ZPARSE_H_
TreeNode。
#include”TokenList.h”
#defineSy_Stack_Max 20//符号栈大小
#defineOpS_Stack_Max 20//操作符栈大小
#defineOpN_Stack_Max 20//操作数栈大小
//******************************************************
//********************非终极符集************************
//******************************************************
enumVN_VT{
VN_Program,//开始符
VN_ProgramHead,
VN_ProgramName,
VN_DeclarePart,
VN_TypeDec,
VN_TypeDeclaration,
VN_TypeDecList,
VN_TypeDecMore,
VN_TypeId,
VN_TypeDef,
VN_BaseType,
VN_Structuretype,
VN_ArrayType,
VN_Low,
VN_Top,
VN_RecType,
VN_FieldDecList,
VN_FieldDecMore,
VN_IdList,
VN_IdMore,
VN_VarDec,
VN_VarDeclaration,
VN_VarDecList,
VN_VarDecMore,
VN_VarIdList,
VN_VarIdMore,
VN_ProcDec,
VN_ProcDeclaration,
VN_ProcDecMore,
VN_ProcName,
VN_ParamList,
VN_ParamDecList,
VN_ParamMore,
VN_Param,
VN_FormList,
VN_FidMore,
VN_ProcDecPart,
VN_ProcBody,
VN_ProgramBody,
VN_StmList,
VN_StmMore,
VN_Stm,
VN_AssCall,
VN_AssignmentRest,
VN_ConditionalStm,
VN_LoopStm,
VN_InputStm,
VN_InVar,
VN_O