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

📄 parse.cpp

📁 上课时老师用过的SNL编译器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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									*/	
/* 功  能 创建语句类型语法树节点函数					*/
/* 说  明 该函数为语法树创建一个新的语句类型结点		*/
/*        并将语法树节点成员初始化						*/
/********************************************************/
Cglobal::TreeNode *  Cparse::newStmtNode(StmtKind kind)

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

  int i;
  
  /* 语法树节点指针t为NULL,未能成功分配内存单元 *
   * 将出错信息及行号lineno写入列表文件listing  */
  if (t==NULL)
  {
	  fprintf(listing,"Out of memory error at line %d\n",lineno);
	  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									*/
/* 功  能 表达式类型语法树节点创建函数					*/
/* 说  明 该函数为语法树创建一个新的表达式类型结点		*/
/*        并将语法树节点的成员初始化					*/
/********************************************************/
Cglobal::TreeNode *  Cparse::newExpNode(ExpKind kind)

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

  /* 语法树节点指针t为NULL,未能成功分配内存单元		*
   * 将出错信息及行号lineno写入列表文件listing		*/
  if (t==NULL)
  {
	  fprintf(listing,"Out of memory error at line %d\n",lineno);
	  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;
}

/********************************************************/
/* 函数名 copyString									*/
/* 功  能 字符串复制函数								*/
/* 说  明 该函数为已存在的字串分配内存单元,并将其复制	*/
/********************************************************/
char * Cparse::copyString(char * s)

{ int n;
  char * t;

  /* 函数参数s所给字串为NULL(空), 函数返回NULL */
  if (s==NULL) return NULL;

  /* 函数参数s所给字串非空,计算字串s长度+1赋给临时变量n */
  n = strlen(s)+1;

  /* 动态分配内存单元,指定单元长度为n,t为指向该单元的指针 */
  t = (char *)malloc(n);

  /* 单元指针t为NULL(空),未能成功分配			*
   * 将出错信息及行号lineno写入列表文件listing  */
  if (t==NULL)
  {
	  fprintf(listing,"Out of memory error at line %d\n",lineno);
	  Error = TRUE;
  }
  /* 调用库函数string.h,复制给定字串s到新字串单元t */
  else strcpy(t,s);

  /* 函数返回复制得到的新字串指针t */
  return t;
}


/*****************************************************************/
/* 函数名 ReadNextToken							        		 */	
/* 功  能 将文件tokenlist中的信息作为返回值                      */							    
/*        一般,listing指向标准输出。                            */
/* 说  明 返回值为TokenType类型,用于语法分析中                  */
/*****************************************************************/
void Cparse::ReadNextToken(TokenType *p)
{
	FILE *fp2;
   /*按只读方式打开文件*/
   fp2=fopen("c:\\Tokenlist","rb");
   if (fp2==NULL)   
         { 
			printf("cannot create file Tokenlist!\n");
			Error = TRUE;
            //exit(0);
	     }  
   fseek(fp2,fp_num*sizeof(TokenType),0);
   fread(p,sizeof(TokenType),1,fp2);
   fp_num++;
   fclose(fp2);
}

/***********************************************************/
/* 函数名 printTab                                         */
/* 功  能 打印空格                                         */
/* 说  明 在输出文件中打印个数为参数tabnum的空格           */
/***********************************************************/
void Cparse::printTab(int tabnum)
{
	for(int i=0;i<tabnum;i++)
		fprintf(listing," ");
}

/********************************************************/
/* 函数名 printSpaces									*/
/* 功  能 空格打印函数									*/
/* 说  明 该函数打印指定数量空格,用于表示子树缩进		*/
/********************************************************/
 void  Cparse::printSpaces(void)

{ int i;

  /* 按给定缩进量indentno打印空格进行缩进	*
   * 其中缩进量indentno总能保持非负			*/
  for (i=0;i<indentno;i++)	
      fprintf(listing," ");	

}

/******************************************************/
/* 函数名 printTree                                   */
/* 功  能 把语法树输出,显示在listing文件中           */
/* 说  明 该函数运用了宏来定义增量减量的缩进          */
/******************************************************/
void   Cparse::printTree(TreeNode  *tree)
{  int i;

  /* 增量缩进宏,每次进入语法树节点都进行增量缩进 */
  INDENT;							

  /* 函数参数给定语法树节点指针tree非NULL(空) */
  while (tree != NULL)
 {		
	/*打印行号*/
	if(tree->lineno==0)
		printTab(9);
	else
	    switch((int)(tree->lineno / 10))
		{
			case 0:
				fprintf(listing,"line:%d",tree->lineno);
				printTab(3);
				break;
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
			case 9:
				fprintf(listing,"line:%d",tree->lineno);
				printTab(2);
				break;
			default:
				fprintf(listing,"line:%d",tree->lineno);
				printTab(1);
		}

    /* 调用函数printSpaces,打印相应的空格,进行缩进 */ 
    printSpaces();	
  
  switch ( tree->nodekind)
  {   case ProK : 
		   fprintf(listing,"%s  ","ProK"); break;
      case PheadK:
		  {fprintf(listing,"%s  ","PheadK");
		   fprintf(listing,"%s  ",tree->name[0]);
		  }
		   break;
	  case DecK:
		{  fprintf(listing,"%s  ","DecK"); 
          if (tree->attr.ProcAttr.paramt==varparamType )
			  fprintf(listing,"%s  ","var param:");
		  if (tree->attr.ProcAttr.paramt==valparamType)
			  fprintf(listing,"%s  ","value param:");
		   switch(tree->kind.dec)
		   { case  ArrayK:
		     { 
			   fprintf(listing,"%s  ","ArrayK");
               fprintf(listing,"%d  ",tree->attr.ArrayAttr.up);
			   fprintf(listing,"%d  ",tree->attr.ArrayAttr.low);
			   if (tree->attr.ArrayAttr.childtype == CharK)
				    fprintf(listing,"%s  ","Chark");
			   else if( tree->attr.ArrayAttr.childtype == IntegerK)
				    fprintf(listing,"%s  ","IntegerK");
			 };break;
		     case  CharK:
			 fprintf(listing,"%s  ","CharK");break;
			 case  IntegerK:
			 fprintf(listing,"%s  ","IntegerK");break;
			 case  RecordK:
			 fprintf(listing,"%s  ","RecordK");break;
			 case  IdK:
			 fprintf(listing,"%s  ","IdK");
			 fprintf(listing,"%s  ",tree->attr.type_name);
			 break;
			 default: 
				 fprintf(listing,"error1!");
				 Error = TRUE;
		   };
         if (tree->idnum !=0)
	       for (int i=0 ; i <= (tree->idnum);i++)
		   {
			   fprintf(listing,"%s  ",tree->name[i]);
				
		   }
		else  
			{
				fprintf(listing,"wrong!no var!\n");
				Error = TRUE;	
			}
		} break;
	  case TypeK:
		   fprintf(listing,"%s  ","TypeK");break;
	  
	  case VarK:
		   fprintf(listing,"%s  ","VarK");
		   if(tree->table[0]!=NULL)
			   fprintf(listing,"%d  %d  ",tree->table[0]->attrIR.More.VarAttr.off,tree->table[0]->attrIR.More.VarAttr.level);
		   break;
	  
	  case ProcDecK: 
			fprintf(listing,"%s  ","ProcDecK");
		    fprintf(listing,"%s  ",tree->name[0]);
			if(tree->table[0]!=NULL)
				fprintf(listing,"%d %d %d  ",tree->table[0]->attrIR.More.ProcAttr.mOff,tree->table[0]->attrIR.More.ProcAttr.nOff,tree->table[0]->attrIR.More.ProcAttr.level);
            break;
	  
	  case StmLK:
		   fprintf(listing,"%s  ","StmLk");break;
	  
	  case StmtK:
		  { fprintf(listing,"%s  ","StmtK");
            switch (tree->kind.stmt)
			{ case IfK:
    		       fprintf(listing,"%s  ","If");break;
			  case WhileK:
		           fprintf(listing,"%s  ","While");break;
			  
			  case AssignK:
		           fprintf(listing,"%s  ","Assign");
				   break;
			  
			  case ReadK:
		           fprintf(listing,"%s  ","Read");
				   fprintf(listing,"%s  " , tree->name[0]);
				   if(tree->table[0]!=NULL)
					   fprintf(listing,"%d   %d  ",tree->table[0]->attrIR.More.VarAttr.off,tree->table[0]->attrIR.More.VarAttr.level);
				   break;
			  
			  case WriteK:
		           fprintf(listing,"%s  ","Write");break;
			  
			  case CallK:
		           fprintf(listing,"%s  ","Call");
				   fprintf(listing,"%s  ", tree->name[0]);
				   break;
			  
			  case ReturnK:
		           fprintf(listing,"%s  ","Return");break;
     
			  default: 
				fprintf(listing,"error2!");
				Error = TRUE;	
			}
          };break;
	  case ExpK: 
		  { fprintf(listing,"%s  ","ExpK");
		    switch (tree->kind.exp)
			{ case OpK:
    		      { fprintf(listing,"%s  ","Op");
			        switch(tree->attr.ExpAttr.op)
					{ case EQ:   fprintf(listing,"%s  " , "="); break;
                      case LT:   fprintf(listing,"%s  " , "<"); break;      
                      case PLUS: fprintf(listing,"%s  " , "+"); break;   
                      case MINUS:fprintf(listing,"%s  " , "-"); break;
					  case TIMES:fprintf(listing,"%s  " , "*"); break;  
                      case OVER: fprintf(listing,"%s  " , "/"); break;  
                      default: 
						  fprintf(listing,"error3!");
						  Error = TRUE;
					}

					if(tree->attr.ExpAttr.varkind==ArrayMembV)
					{
						fprintf(listing,"ArrayMember  ");
						fprintf(listing,"%s  ",tree->name[0]);
					}
                  };break;
			  case ConstK:
				    fprintf(listing,"%s  ","Const");
					switch(tree->attr.ExpAttr.varkind)
					{
						case IdV:
					    fprintf(listing,"Id  ");
						fprintf(listing,"%s  ",tree->name[0]);
						break;
						case FieldMembV:
					    fprintf(listing,"FieldMember  ");
					    fprintf(listing,"%s  ",tree->name[0]);
						break;
						case ArrayMembV:
					    fprintf(listing,"ArrayMember  ");
						fprintf(listing,"%s  ",tree->name[0]);
						break;
						default: 
							fprintf(listing,"var type error!");
							Error = TRUE;
					}
					
					fprintf(listing,"%d  ",tree->attr.ExpAttr.val);
					break;
			  case VariK:
		           fprintf(listing,"%s  ","Vari");
                   switch(tree->attr.ExpAttr.varkind)
				   {
						case IdV:
					    fprintf(listing,"Id  ");
						fprintf(listing,"%s  ",tree->name[0]);
						break;
						case FieldMembV:

⌨️ 快捷键说明

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