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

📄 parseb.java

📁 编译原理实验
💻 JAVA
📖 第 1 页 / 共 5 页
字号:

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

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

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

		/* 初始化新语法树节点t各子节点child[i]为null */
	    for (i=0;i<3;i++) t.child[i] = null;

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

		for(i=0;i<10;i++) 
		{
			t.name[i]="\0";
			t.table[i] = null;
		}

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


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

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

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

		/* 初始化新语法树节点t各子节点child[i]为null */
	    for (i=0;i<3;i++) t.child[i] = null;

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

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

	    t.idnum = 0;

		for(i=0;i<10;i++) 
		{
			t.name[i]="\0";
			t.table[i] = null;
		}

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

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

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

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

		/* 初始化新语法树节点t各子节点child[i]为null */
	    for (i=0;i<3;i++) t.child[i] = null;

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

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

	    t.idnum = 0;

		for(i=0;i<10;i++) 
		{
			t.name[i]="\0";
			t.table[i] = null;
		}

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

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

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

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

		/* 初始化新语法树节点t各子节点child[i]为null */
	    for (i=0;i<3;i++) t.child[i] = null;

		/* 初始化新语法树节点t兄弟节点sibling为null */
		t.sibling = null;
	    
		/* 指定新语法树节点t成员:结点类型nodekind为语句类型StmtK */
		t.nodekind = 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++) 
		{
			t.name[i]="\0";
			t.table[i] = null;
		}
	  }
	  /* 函数返回语句类型语法树节点指针t */
	  return t;
	}


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

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

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

		/* 初始化新语法树节点t各子节点child[i]为null */
	    for (i=0;i<3;i++) t.child[i] = null;

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

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

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

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

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

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

	    for(i=0;i<10;i++) 
		{
			t.name[i]="\0";
			t.table[i] = null;
		}
	  }

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

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

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

	{ int i;

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

	}

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

	// 增量缩进宏,每次进入语法树节点都进行增量缩进 /
	indentno += 4;

	// 函数参数给定语法树节点指针tree非null(空) /
	while (tree != null) {
		// 打印行号 /
		if (tree.lineno == 0)
			printTab(9);
		else
			switch ((int) (tree.lineno / 10)) {
			case 0:
				Translate.parseArea.append("line:" + tree.lineno);
				printTab(3);
				break;
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
			case 9:
				Translate.parseArea.append("line:" + tree.lineno);
				printTab(2);
				break;
			default:
				Translate.parseArea.append("line:" + tree.lineno);
				printTab(1);
			}

		// 调用函数printSpaces,打印相应的空格,进行缩进 /
		printSpaces();

		switch (tree.nodekind) {
		case ProK:
			Translate.parseArea.append("  " + "Prok");
			break;
		case PheadK: {
			Translate.parseArea.append("  " + "PheadK");
			Translate.parseArea.append("  " + tree.name[0]);
		}
			break;
		case DecK: {
			Translate.parseArea.append("  " + "DecK");
			if (tree.attr.procAttr.paramt == ParamType.varparamType)
				Translate.parseArea.append("  " + "var param:");
			if (tree.attr.procAttr.paramt == ParamType.valparamType)
				Translate.parseArea.append("  " + "value param:");
			switch (tree.kind.dec) {
			case ArrayK: {
				Translate.parseArea.append("  " + "ArrayK");
				Translate.parseArea.append("  " + tree.attr.arrayAttr.up);
				Translate.parseArea.append("  " + tree.attr.arrayAttr.low);
				if (tree.attr.arrayAttr.childtype == DecKind.CharK)
					Translate.parseArea.append("  " + "Chark");
				else if (tree.attr.arrayAttr.childtype == DecKind.IntegerK)
					Translate.parseArea.append("  " + "IntegerK");
			}
				;
				break;
			case CharK:
				Translate.parseArea.append("  " + "CharK");
				break;
			case IntegerK:
				Translate.parseArea.append("  " + "IntegerK");
				break;
			case RecordK:
				Translate.parseArea.append("  " + "RecordK");
				break;
			case IdK:
				Translate.parseArea.append("  " + "IdK");
				Translate.parseArea.append("  " + tree.attr.type_name);
				break;
			default:
				Translate.parseArea.append("isError1!");
				isError = true;
			}
			;
			if (tree.idnum >= 0)
				for (i = 0; i <= (tree.idnum); i++) {
					Translate.parseArea.append("  " + tree.name[i]);

				}
			else {
				Translate.parseArea.append("wrong!no var!\n");
				isError = true;
			}
		}
			break;
		case TypeK:
			Translate.parseArea.append("  " + "TypeK");
			break;

		case VarK:
			Translate.parseArea.append("  " + "VarK");
			// if(tree.table[0]!=null)
			// Translate.parseArea.append("
			// "+tree.table[0].attrIR.More.VarAttr.off,tree.table[0].attrIR.More.VarAttr.level);
			break;

		case ProcDecK:
			Translate.parseArea.append("  " + "ProcDecK");
			Translate.parseArea.append("  " + tree.name[0]);
			// if(tree.table[0]!=null)
			// Translate.parseArea.append("
			// "+tree.table[0].attrIR.More.ProcAttr.mOff,tree.table[0].attrIR.More.ProcAttr.nOff,tree.table[0].attrIR.More.ProcAttr.level);
			break;

		case StmLK:
			Translate.parseArea.append("  " + "StmLk");
			break;

		case StmtK: {
			Translate.parseArea.append("  " + "StmtK");
			switch (tree.kind.stmt) {
			case IfK:
				Translate.parseArea.append("  " + "If");
				break;
			case WhileK:
				Translate.parseArea.append("  " + "While");
				break;

			case AssignK:
				Translate.parseArea.append("  " + "Assign");
				break;

⌨️ 快捷键说明

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