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

📄 func.cpp

📁 SNL语言编译器源码 小语言的编译器C++实现 包括词法分析
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	/* 指定新语法树节点t成员: 结点类型nodekind为表达式类型ExpK */
	t->nodekind = TypeK;


	/* 指定新语法树节点t成员: 源代码行号lineno为全局变量lineno */
    t->lineno = lineno;
   
	t->idnum = 0;
	/*初始化符号表地址指针*/
	for (int i=0;i<10;i++)
	   t->table[i] = NULL;

  }

  /* 函数返回表达式类型语法树结点指针t */
  return t;
}

/********************************************************/
/* 函数名 newVarNode									*/
/* 功  能 变量声明标志语法树节点创建函数				*/
/* 说  明 该函数为语法树创建一个新的变量声明标志结点,
/*         表示在它之下的声明都为变量声明,           	*/
/*        并将语法树节点的成员初始化					*/
/********************************************************/
TreeNode * Syntax::newVarNode()

{ 
  /* 内存中动态申请分配单元,返回指向该单元的语法树节点类型指针t */
  TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
  
  int i;

  /* 语法树节点指针t为NULL,未能成功分配内存单元		*
   * 将出错信息及行号lineno写入列表文件listing		*/
  if (t==NULL)
	  cout<<"Out of memory error at line"<<lineno<<endl;
  /* 语法树节点指针t不是NULL,内存单元已经成功分配 */
  else {

	/* 初始化新语法树节点t各子节点child[i]为NULL */
    for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;

	/* 初始化新语法树节点t兄弟节点sibling为NULL(空) */
   	t->sibling = NULL;

	/* 指定新语法树节点t成员: 结点类型nodekind为表达式类型ExpK */
	t->nodekind = VarK;

	/* 指定新语法树节点t成员: 源代码行号lineno为全局变量lineno */
    t->lineno = lineno;

    t->idnum = 0;
	/*初始化符号表地址指针*/
	for (int i=0;i<10;i++)
	   t->table[i] = NULL;
  }

  /* 函数返回表达式类型语法树结点指针t */
  return t;
}

//试试,如果行的话,就把它们合成一个!!!!






/********************************************************/
/* 函数名 newDecNode									*/	
/* 功  能 创建声明类型语法树节点函数					*/
/* 说  明 该函数为语法树创建一个新的声明类型结点		*/
/*        并将语法树节点成员初始化						*/
/********************************************************/
TreeNode * Syntax::newDecNode(void)

{
  /* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
  TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));

  int i;
  
  /* 语法树节点指针t为NULL,未能成功分配内存单元 *
   * 将出错信息及行号lineno写入列表文件listing  */
  if (t==NULL)
  {
	  cout<<"Out of memory error at line"<<lineno<<endl;
	  Error = TRUE;
  }

  /* 语法树节点指针t不是NULL,成功分配内存单元 */
  else {

	/* 初始化新语法树节点t各子节点child[i]为NULL */
    for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;

	/* 初始化新语法树节点t兄弟节点sibling为NULL */
	t->sibling = NULL;
    
	/* 指定新语法树节点t成员:结点类型nodekind为语句类型DecK*/
	t->nodekind = DecK;
    
	/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
	t->lineno = lineno;
    
	t->idnum=0;

	for(i=0;i<10;i++) 
	{
		strcpy(t->name[i],"\0");
		t->table[i] = NULL;
	}

  }
  /* 函数返回声明类型语法树节点指针t */
  return t;
}


/********************************************************/
/* 函数名 newProcNode									*/	
/* 功  能 创建函数类型语法树节点函数					*/
/* 说  明 该函数为语法树创建一个新的函数类型结点		*/
/*        并将语法树节点成员初始化						*/
/********************************************************/
TreeNode * Syntax::newProcNode(void)

{
  /* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
  TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));

  int i;
  
  /* 语法树节点指针t为NULL,未能成功分配内存单元 *
   * 将出错信息及行号lineno写入列表文件listing  */
  if (t==NULL)
  {
	  cout<<"Out of memory error at line"<<lineno<<endl;
      Error = TRUE;
  }
  /* 语法树节点指针t不是NULL,成功分配内存单元 */
  else {

	/* 初始化新语法树节点t各子节点child[i]为NULL */
    for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;

	/* 初始化新语法树节点t兄弟节点sibling为NULL */
	t->sibling = NULL;
    
	/* 指定新语法树节点t成员:结点类型nodekind为语句类型ProcDecK */
	t->nodekind = ProcDecK;

    
	/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
	t->lineno = lineno;

    t->idnum = 0;

	for(i=0;i<10;i++) 
	{
		strcpy(t->name[i],"\0");
		t->table[i] = NULL;
	}

  }
  /* 函数返回语句类型语法树节点指针t */
  return t;
}

/********************************************************/
/* 函数名 newStmlNode									*/	
/* 功  能 创建语句标志类型语法树节点函数				*/
/* 说  明 该函数为语法树创建一个新的语句标志类型结点	*/
/*        并将语法树节点成员初始化						*/
/********************************************************/
TreeNode * Syntax::newStmlNode(void)

{
  /* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
  TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));

  int i;
  
  /* 语法树节点指针t为NULL,未能成功分配内存单元 *
   * 将出错信息及行号lineno写入列表文件listing  */
  if (t==NULL)
  {
	  cout<<"Out of memory error at line"<<lineno<<endl;
	  Error = TRUE;
  }
  /* 语法树节点指针t不是NULL,成功分配内存单元 */
  else {

	/* 初始化新语法树节点t各子节点child[i]为NULL */
    for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;

	/* 初始化新语法树节点t兄弟节点sibling为NULL */
	t->sibling = NULL;
    
	/* 指定新语法树节点t成员:结点类型nodekind为语句类型StmLK */
	t->nodekind = StmLK;

    /* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
	t->lineno = lineno;

    t->idnum = 0;

	for(i=0;i<10;i++) 
	{
		strcpy(t->name[i],"\0");
		t->table[i] = NULL;
	}

  }
   /*函数返回语句类型语法树节点指针t*/ 
  return t;
}

/********************************************************/
/* 函数名 newStmtNode									*/	
/* 功  能 创建语句类型语法树节点函数					*/
/* 说  明 该函数为语法树创建一个新的语句类型结点		*/
/*        并将语法树节点成员初始化						*/
/********************************************************/
TreeNode * Syntax::newStmtNode(StmtKind kind)

{
  /* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
  TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));

  int i;
  
  /* 语法树节点指针t为NULL,未能成功分配内存单元 *
   * 将出错信息及行号lineno写入列表文件listing  */
  if (t==NULL)
  {
	  cout<<"Out of memory error at line"<<lineno<<endl;
	  Error = TRUE;
  }
  /* 语法树节点指针t不是NULL,成功分配内存单元 */
  else {

	/* 初始化新语法树节点t各子节点child[i]为NULL */
    for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;

	/* 初始化新语法树节点t兄弟节点sibling为NULL */
	t->sibling = NULL;
    
	/* 指定新语法树节点t成员:结点类型nodekind为语句类型StmtK */
	t->nodekind = StmtK;

	/* 指定新语法树节点t成员:语句类型kind.stmt为函数给定参数kind */
    t->kind.stmt = kind;
    
	/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
	t->lineno = lineno;

	t->idnum = 0;

	for(i=0;i<10;i++) 
	{
		strcpy(t->name[i],"\0");
		t->table[i] = NULL;
	}
  }
  /* 函数返回语句类型语法树节点指针t */
  return t;
}


/********************************************************/
/* 函数名 newExpNode									*/
/* 功  能 表达式类型语法树节点创建函数					*/
/* 说  明 该函数为语法树创建一个新的表达式类型结点		*/
/*        并将语法树节点的成员初始化					*/
/********************************************************/
TreeNode * Syntax::newExpNode(ExpKind kind)

{ 
  /* 内存中动态申请分配单元,返回指向该单元的语法树节点类型指针t */
  TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
  
  int i;

  /* 语法树节点指针t为NULL,未能成功分配内存单元		*
   * 将出错信息及行号lineno写入列表文件listing		*/
  if (t==NULL)
  {
	  cout<<"Out of memory error at line"<<lineno<<endl;
	  Error = TRUE;
  }
  /* 语法树节点指针t不是NULL,内存单元已经成功分配 */
  else {

	/* 初始化新语法树节点t各子节点child[i]为NULL */
    for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;

	/* 初始化新语法树节点t兄弟节点sibling为NULL(空) */
   	t->sibling = NULL;

	/* 指定新语法树节点t成员: 结点类型nodekind为表达式类型ExpK */
	t->nodekind = ExpK;

	/* 指定新语法树节点t成员: 表达式类型kind.exp为函数给定参数kind */
  	t->kind.exp = kind;

	/* 指定新语法树节点t成员: 源代码行号lineno为全局变量lineno */
    t->lineno = lineno;

	/* 指定新语法树节点t成员: 表达式为变量类型时的变量类型varkind *
	/* 为IdV.*/
	t->attr.ExpAttr.varkind = IdV;

	/* 指定新语法树节点t成员: 类型检查类型type为Void */
 	t->attr.ExpAttr.type = Void;

    for(i=0;i<10;i++) 
	{
		strcpy(t->name[i],"\0");
		t->table[i] = NULL;
	}
  }

  /* 函数返回表达式类型语法树结点指针t */
  return t;
}

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

/********************************************************************/
/* 函数名 program												    */
/* 功  能 总程序的处理函数								        	*/
/* 产生式 < program > ::= programHead declarePart programBody .     */
/* 说  明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点  */
/*        语法树的根节点的第一个子节点指向程序头部分programHead,    */
/*        DeclaraPart为programHead的兄弟节点,程序体部分programBody  */
/*        为declarePart的兄弟节点.                                  */
/********************************************************************/
TreeNode * Syntax::program(void)
{
	TreeNode * t=programHead();
	TreeNode * q=declarePart();
	TreeNode * s=programBody();
	
	TreeNode * root =newRootNode();
    if(root!=NULL)
	{
		root->lineno = 0;
		if(t!=NULL) root->child[0] = t;
	      else syntaxError("a program head is expected!");
	    if(q!=NULL) root->child[1] = q;
	    if(s!=NULL) root->child[2] = s;
	      else syntaxError("a program body is expected!");
	}
	match(DOT);


	return root;
}

/********************************************************************/
/* 函数名 programHead											    */
/* 功  能 程序头的处理函数								        	*/
/* 产生式 < programHead > ::= PROGRAM  ProgramName                  */
/* 说  明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点  */
/********************************************************************/
TreeNode * Syntax::programHead(void)
{
    TreeNode * t = newPheadNode();
	match(PROGRAM);
    if((t!=NULL)&&(token.Lex==ID))
	{   
		t->lineno = 0;
		strcpy(t->name[0], token.Sem);
	}
    match(ID);
    return t;
}	
    
/*************************声明部分***********************************/

/********************************************************************/
/* 函数名 declarePart											    */
/* 功  能 声明部分的处理函数								     	*/
/* 产生式 < declarePart > ::= typeDec  varDec  procDec              */
/* 说  明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点  */
/********************************************************************/
TreeNode * Syntax::declarePart(void)
{
     /*类型*/
	 TreeNode * typeP = newDecANode(TypeK);  
	 TreeNode * pp = typeP;  
	 
	 if(typeP!=NULL)
	 {
		 typeP->lineno = 0;
		 TreeNode * tp1 = typeDec();
	     if(tp1!=NULL)
		     typeP->child[0] = tp1;
		 else
		 {
			 free(typeP);
		     typeP=NULL;
		 }
	 }
	 /*变量*/
	 TreeNode * varP =newDecANode(VarK);
	 
	 if(varP != NULL)
	 {
		 varP->lineno = 0;
		 TreeNode * tp2 = varDec();
		 if(tp2 != NULL)
	          varP->child[0] = tp2;
		 else 
		 {

⌨️ 快捷键说明

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