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

📄 func.h

📁 SNL语言编译器源码 小语言的编译器C++实现 包括词法分析
💻 H
字号:
/*静态函数类文件,定义静态函数类*/

#include "globals.h"	/* 该头文件globals.h定义了全局类与变量 */

#ifndef _FUNC_H_
#define _FUNC_H_


/*词法分析*/
class scanner
{
public:
 
	 static  int getNextChar(FILE *source);
	 static  void ungetNextChar(void);
	 static LexType  reservedLookup (char * s);

};




/*语法分析*/

//  ChainNodeType * currentP;  //词法分析结果:Token链表的头指针


class Syntax
{
private:

     TokenType token; //记录当前读入的token

     char * temp_name;

     int line0;

	 //  int  token_num;    /*输出时记录token个数的变量*/

     ChainNodeType * currentP;  //词法分析结果:Token链表的头指针
	


public:


/*返回成员变量的值*/
 TokenType getToken();
 char * getTemp_name();
 int getLine0();
 

 void setCurrentP(ChainNodeType * tokenl);  //获得词法分析的结果的链表头指针

 void syntaxError(char * message); //语法错误处理函数

 void match(LexType expected);  //终极符匹配处理函数

 char * copyString(char * s); //字符串复制函数

 void ReadNextToken();  //读入到当前token

/********************************************************
 *********以下是创建语法树所用的各类节点的申请***********
 ********************************************************/

 TreeNode * newRootNode(void);

 TreeNode * newPheadNode(void);

 TreeNode * newDecANode(NodeKind kind);

  TreeNode * newTypeNode();

  TreeNode * newVarNode();

  TreeNode * newDecNode(void);

  TreeNode * newProcNode(void);

  TreeNode * newStmlNode(void);

  TreeNode * newStmtNode(StmtKind kind);

  TreeNode * newExpNode(ExpKind kind);


/********** 递归调用的成员函数原型 ************/

  TreeNode * program(void);  

  TreeNode * programHead(void);

  TreeNode * declarePart(void);

  TreeNode * typeDec(void);

  TreeNode * typeDeclaration(void);

  TreeNode * typeDecList(void);

  TreeNode * typeDecMore(void);

  void  typeId(TreeNode * t);

  void  typeName(TreeNode * t);

  void  baseType(TreeNode * t);

  void  structureType(TreeNode * t);

  void  arrayType(TreeNode * t);

  void  recType(TreeNode * t);

  TreeNode * fieldDecList(void);
 
  TreeNode * fieldDecMore(void);

  void  idList(TreeNode * t);

  void  idMore(TreeNode * t);

  TreeNode * varDec(void);

  TreeNode * varDeclaration(void);

  TreeNode * varDecList(void);

  TreeNode * varDecMore(void);

  void  varIdList(TreeNode * t);

  void  varIdMore(TreeNode * t);

  TreeNode * procDec(void);

  TreeNode * procDeclaration(void);

  void  paramList(TreeNode * t);

  TreeNode * paramDecList(void);

  TreeNode * param(void);

  TreeNode * paramMore(void);

  void  formList(TreeNode * t);

  void  fidMore(TreeNode * t);

  TreeNode * procDecPart(void);

  TreeNode * procBody(void);

  TreeNode * programBody(void);

  TreeNode * stmList(void);

  TreeNode * stmMore(void);

  TreeNode * stm(void);

  TreeNode * assCall(void);

  TreeNode * assignmentRest(void);	

  TreeNode * conditionalStm(void);

  TreeNode * loopStm(void);

  TreeNode * inputStm(void);		

  TreeNode * outputStm(void);	

  TreeNode * returnStm(void);

  TreeNode * callStmRest(void);

  TreeNode * actParamList(void);

  TreeNode * actParamMore(void);

  TreeNode * exp(void);			/* 处理表达式函数 */

  TreeNode * simple_exp(void);		/* 处理简单表达式函数 */

  TreeNode * term(void);			/* 处理项函数 */

  TreeNode * factor(void);			/* 处理因子函数 */

  TreeNode * variable(void);

  void variMore(TreeNode * t);

  TreeNode * fieldvar(void);

  void fieldvarMore(TreeNode * t );

};

//语义分析函数类
class SemAnalyze
{

private:


	

    /*在同层的变量偏移*/
    int Off;

    /*主程序的noff偏移*/
    int mainOff;

	
    SymbTable * scope[SCOPESIZE];   /*scope栈*/



public:

	/*-----------------语义分析功能函数---------------------------*/
	SymbTable **returnScope();
    void initialize(void);

    TypeIR  * TypeProcess(TreeNode * t,DecKind deckind);

    TypeIR * nameType(TreeNode * t);

    TypeIR  * arrayType(TreeNode * t);

    TypeIR * recordType(TreeNode * t);


    void TypeDecPart(TreeNode * t);
 
    void VarDecPart(TreeNode * t);

    void varDecList(TreeNode * t);

    void  procDecPart(TreeNode * t);

    SymbTable  *  HeadProcess(TreeNode * t);

    ParamTable  * ParaDecList(TreeNode * t) ;

    void Body(TreeNode * t);
	
    void statement (TreeNode * t);

    TypeIR * Expr(TreeNode * t,AccessKind  *  Ekind);

    TypeIR * arrayVar(TreeNode * t);

    TypeIR * recordVar(TreeNode * t);

    void assignstatement(TreeNode * t);

    void callstatement(TreeNode * t);

    void ifstatment(TreeNode * t );

    void whilestatement(TreeNode * t);

    void readstatement (TreeNode * t);

    void writestatement(TreeNode * t );

    void returnstatement(TreeNode * t );


	/*-----------------管理符号表功能函数---------------------------*/
    SymbTable * NewTable(void);

    void CreatTable(void);

    void DestroyTable(void);

    int Enter(char * id,AttributeIR * attribP,SymbTable ** entry);

    int FindEntry(char * id,SymbTable ** entry);

    AttributeIR FindAttr(SymbTable * entry);

    int Compat(TypeIR * tp1,TypeIR * tp2);

    TypeIR * NewTy(TypeKind kind);

    fieldChain * NewBody(void);

    ParamTable * NewParam(void);

    void ErrorPrompt(int line,char * name,char * message);


   bool  FindField(char * Id , fieldChain  *head,fieldChain  **Entry );


};

#endif

⌨️ 快捷键说明

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