SNL语言-吉大计算机编译原理课程设计.doc

上传人:zf 文档编号:11606113 上传时间:2023-03-22 格式:DOC 页数:44 大小:217.04KB
下载 相关 举报
SNL语言-吉大计算机编译原理课程设计.doc_第1页
第1页 / 共44页
SNL语言-吉大计算机编译原理课程设计.doc_第2页
第2页 / 共44页
SNL语言-吉大计算机编译原理课程设计.doc_第3页
第3页 / 共44页
SNL语言-吉大计算机编译原理课程设计.doc_第4页
第4页 / 共44页
SNL语言-吉大计算机编译原理课程设计.doc_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

SNL语言-吉大计算机编译原理课程设计.doc

《SNL语言-吉大计算机编译原理课程设计.doc》由会员分享,可在线阅读,更多相关《SNL语言-吉大计算机编译原理课程设计.doc(44页珍藏版)》请在冰豆网上搜索。

SNL语言-吉大计算机编译原理课程设计.doc

SNL语言_吉大计算机编译原理课程设计

/*analyze。

h*/

#ifndef_ANALYZE_H_

#define_ANALYZE_H_

#defineScopeMaxLevel20

#include”TreeNode。

h”

enumIdKind {typeKind,varKind,procKind};

enumTypeKind {intType,charType,arrayType,recordType,boolType};

enumAccessKind {dir,indir};

structTypeIR;

structSymbolChain;

structParamChain

{

SymbolChain * entry;

ParamChain * next;

};

structFieldChain

{

char idName[10];

TypeIR * unitType;

int offset;

FieldChain * next;

};

structTypeIR

{

int size;

TypeKind kind;

union

{

struct

TypeIR * indexType;

TypeIR * elementType;

}ArrayAttr;

FieldChain * body;

}More;

};

structAttributeIR

TypeIR * idType;

IdKind kind;

unionMore

{

struct

{

AccessKind access;

int level;

int offset;

}VarAttr;

struct

{

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。

h*/

#ifndef_PARSE_H_

#define_PARSE_H_

#include"TokenList。

h”

#include”TreeNode.h"

classparse{

private:

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*);

};

#endif

/*scan.h*/

#ifndef_SCAN_H_

#define_SCAN_H_

#include"TokenList。

h”

classscan

public:

staticTokenList*doScan(ifstream*,ofstream*);

private:

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*);

};

#endif

/*Token.h*/

#ifndef_TOKEN_H_

#define_TOKEN_H_

#include〈iostream〉

#include

usingnamespacestd;

enumLexType{

ID, //标识符

CHARC, //字符串

RESERVEDWORD, //保留字

INST, //整型常量符

OP, //运算符

ASSIGN, //赋值运算符

DELIMITER, //分界符

RANGE, //数组下标

POINTER, //结构类型成员运算符

DOT, //程序结束标志

ENDFILE, //文件结束标志

ERROR, //错误符号

};

classToken

public:

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();

private:

int line;

char* sem;

LexType lex;

};

#endif

/*TokenList.h*/

#ifndef_TOKENLIST_H_

#define_TOKENLIST_H_

#include"Token.h"

classTokenList{

public:

TokenList();

~TokenList();

void setToken(Token*);

void setNext(TokenList*);

void setNumber(int);

int getNumber();

Token*getToken();

TokenList*getNext();

void append();

private:

intnumber;

Token*token;

TokenList*next;

};

#endif

/*Treenode。

h*/

#ifndef_TREENODE_H_

#define_TREENODE_H_

#include〈string>

#include〈iostream〉

#include〈fstream〉

usingnamespacestd;

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

public:

NODE_KIND nodekind;

TreeNode* child[3];

TreeNode* sibling;

char *idname[3];

int lineno;

KIND kind;

char *type_name;

Attr attr;

int idnum;

int childnum;

public:

//设置表达式属性*****************************************************

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_

#include"TreeNode。

h”

#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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1