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

📄 parseb.java

📁 编译原理实验
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
			case ReadK:
				Translate.parseArea.append("  " + "Read");
				Translate.parseArea.append("  " + tree.name[0]);
				// if(tree.table[0]!=null)
				// Translate.parseArea.append( "
				// "+tree.table[0].attrIR.More.VarAttr.off,tree.table[0].attrIR.More.VarAttr.level);
				break;

			case WriteK:
				Translate.parseArea.append("  " + "Write");
				break;

			case CallK:
				Translate.parseArea.append("  " + "Call");
				Translate.parseArea.append("  " + tree.name[0]);
				break;

			case ReturnK:
				Translate.parseArea.append("  " + "Return");
				break;

			default:
				Translate.parseArea.append("isError2!");
				isError = true;
			}
		}
			;
			break;
		case ExpK: {
			Translate.parseArea.append("  " + "ExpK");
			switch (tree.kind.exp) {
			case OpK: {
				Translate.parseArea.append("  " + "Op");
				switch (tree.attr.expAttr.op) {
				case EQ:
					Translate.parseArea.append("  " + "=");
					break;
				case LT:
					Translate.parseArea.append("  " + "<");
					break;
				case PLUS:
					Translate.parseArea.append("  " + "+");
					break;
				case MINUS:
					Translate.parseArea.append("  " + "-");
					break;
				case TIMES:
					Translate.parseArea.append("  " + " ");
					break;
				case OVER:
					Translate.parseArea.append("  " + "/");
					break;
				default:
					Translate.parseArea.append("isError3!");
					isError = true;
				}

				if (tree.attr.expAttr.varkind == VarKind.ArrayMembV) {
					Translate.parseArea.append("  ArrayMember  ");
					Translate.parseArea.append("  " + tree.name[0]);
				}
			}
				;
				break;
			case ConstK:
				Translate.parseArea.append("  " + "Const");
				switch (tree.attr.expAttr.varkind) {
				case IdV:
					Translate.parseArea.append("  Id  ");
					Translate.parseArea.append("  " + tree.name[0]);
					break;
				case FieldMembV:
					Translate.parseArea.append("  FieldMember  ");
					Translate.parseArea.append("  " + tree.name[0]);
					break;
				case ArrayMembV:
					Translate.parseArea.append("  ArrayMember  ");
					Translate.parseArea.append("  " + tree.name[0]);
					break;
				default:
					Translate.parseArea.append("var type isError!");
					isError = true;
				}

				Translate.parseArea.append("  " + tree.attr.expAttr.val);
				break;
			case VariK:
				Translate.parseArea.append("  " + "Vari");
				switch (tree.attr.expAttr.varkind) {
				case IdV:
					Translate.parseArea.append("  Id  ");
					Translate.parseArea.append("  " + tree.name[0]);
					break;
				case FieldMembV:
					Translate.parseArea.append("  FieldMember  ");
					Translate.parseArea.append("  " + tree.name[0]);
					break;
				case ArrayMembV:
					Translate.parseArea.append("  ArrayMember  ");
					Translate.parseArea.append("  " + tree.name[0]);
					break;
				default:
					Translate.parseArea.append("var type isError!");
					isError = true;
				}
				// if(tree.table[0]!=null)
				// Translate.parseArea.append("
				// "+tree.table[0].attrIR.More.VarAttr.off,tree.table[0].attrIR.More.VarAttr.level);

				break;
			default:
				Translate.parseArea.append("isError4!");
				isError = true;
			}
		}
			;
			break;
		default:
			Translate.parseArea.append("isError5!");
			isError = true;
		}

		Translate.parseArea.append("\n");

		// 对语法树结点tree的各子结点递归调用printTree过程
		// 缩进写入列表文件listing /
		for (i = 0; i < 3; i++)
			printTree(tree.child[i]);

		// 对语法树结点tree的兄弟节点递归调用printTree过程
		// 缩进写入列表文件listing /
		tree = tree.sibling;
	}

	// 减量缩进宏,每次退出语法树节点时减量缩进 /
	indentno -= 4;

	  
	}
	/********************************************************
	 *********以下是LL1语法分析方法所用到的栈操作************
	 ********************************************************/

	/*用链表实现栈操作,栈中存放的是终极符和非终极符,上面的两个枚举
	  类型*/
	void Push(int i,int j)
	{ StackNode p;
	  p=new StackNode();
	  
	  if (i==1)     
	    p.ntmlvar=nontmlType[j];
	  else if (i==2)
	          p.tmlvar=lexType[j];
	  
	  p.flag=i;
	  p.underNode=stackTop;
	  stackTop=p;
	  STACKEMPTY=false;
	}

	

	void  Pop()
	{ StackNode p;
	  p=stackTop;
	  stackTop=stackTop.underNode;
	  p=null;
	  if (stackTop==null)
		  STACKEMPTY=true;
	}

	/*读栈顶标志,看是终极符还是非终极符*/
	int readStackflag()
	{ int j;
	  j=stackTop.flag ;
	  return(j);
	}

	/*非终极符时*/
	NontmlType readstackN()
	{
	  return ((stackTop).ntmlvar);
	}

	/*终极符*/
	LexType readstackT()
	{
	  return ((stackTop).tmlvar);
	}


	/*压栈的实现过程,压入的是指向树节点的指针的地址*/
	void  PushPA(TreeNode t)
	{
		StackNodePA p=null;
	    p=new StackNodePA();
		p.pointer= t ;
		p.underNode =stackTopPA;
	    stackTopPA=p;
	    paSTACKEMPTY=false;
	}
	/*弹栈的实现过程*/
	TreeNode PopPA()
	{     
	  StackNodePA  p=null;
	  TreeNode   backpointer;
	  p = stackTopPA;
	  backpointer=p .pointer;
	  stackTopPA=stackTopPA.underNode;
	  p=null;
	  if (stackTopPA==null)
		  paSTACKEMPTY=true;

	  return backpointer;
	}


	/*操作符栈的压栈实现过程,压入的是指向树节点的指针*/
	void  PushOp(TreeNode t)
	{
		StackNodeP p=null;
	    p=new StackNodeP();
		p.pointer= t ;
		p.underNode =OpStackTop;
	    OpStackTop=p;
		OpSTACKEMPTY=false;
	}

	/*操作符栈的弹栈实现过程*/
	TreeNode PopOp()
	{     
	  StackNodeP p=null;
	  TreeNode   backpointer;
	  p=OpStackTop;
	  backpointer=p.pointer;
	  OpStackTop=OpStackTop.underNode;
	  p=null;
	  if (OpStackTop==null)
		  OpSTACKEMPTY= true;

	  return backpointer;
	}

	LexType ReadOpStack()
	{
		TreeNode t1;
		t1=OpStackTop.pointer;
	    return (t1.attr.expAttr.op);
	}
	/*操作数栈的压栈实现过程,压入的是指向树节点的指针*/
	void  PushNum(TreeNode t)
	{
		StackNodeP p=null;
	    p =new StackNodeP();
		p.pointer= t ;
		p.underNode =NumStackTop;
	    NumStackTop=p;
		NumSTACKEMPTY=false;
	}
	/*操作数栈的弹栈实现过程*/
	TreeNode PopNum()
	{     
	  StackNodeP  p=null;
	  TreeNode    backpointer;
	  p =NumStackTop;
	  backpointer=p.pointer;
	  NumStackTop=NumStackTop.underNode;
	  p=null;
	  if (NumStackTop==null)
		  NumSTACKEMPTY=true;

	  return backpointer;
	}
	 


	/************<语法分析功能函数> **************/

	/********************************************************/
	/* 函数名  CreatLL1Table								*/
	/* 功  能  创建LL1分析表								*/
	/* 说  明  初始数组(表)中的每一项都为0;根据LL1文法   */
	/*         给数组赋值(填表);填好后,若值为0,		*/
	/*         表示无产生式可选,其他,为选中的产生式  		*/
	/********************************************************/

	void CreatLL1Table()
	{ int i,j;
	  
	  /*初始化LL1表元素*/  
	  for (i=0;i<104;i++)
		  for (j=0;j<104;j++)
		     LL1Table[i][j]=0;

	  LL1Table	[NontmlType.Program.ordinal()][LexType.PROGRAM.ordinal()]=1;

	  LL1Table	[NontmlType.ProgramHead.ordinal()][LexType.PROGRAM.ordinal()]  =		2;

	  LL1Table	[NontmlType.ProgramName.ordinal()][LexType.ID.ordinal()]	   =		3;
	  
	  LL1Table	[NontmlType.DeclarePart.ordinal()][LexType.TYPE.ordinal()]=			4;
	  LL1Table	[NontmlType.DeclarePart.ordinal()][LexType.VAR.ordinal()]=				4;
	  LL1Table	[NontmlType.DeclarePart.ordinal()][LexType.PROCEDURE.ordinal()]=		4;
	  LL1Table	[NontmlType.DeclarePart.ordinal()][LexType.BEGIN.ordinal()]=			4;
	  
	  LL1Table	[NontmlType.TypeDec.ordinal()][LexType.VAR.ordinal()]=					5;
	  LL1Table	[NontmlType.TypeDec.ordinal()][LexType.PROCEDURE.ordinal()]=			5;
	  LL1Table	[NontmlType.TypeDec.ordinal()][LexType.BEGIN.ordinal()]=				5;
	  
	  LL1Table	[NontmlType.TypeDec.ordinal()][LexType.TYPE.ordinal()]=				6;
	  
	  LL1Table	[NontmlType.TypeDeclaration.ordinal()][LexType.TYPE.ordinal()]=		7;
	  
	  LL1Table	[NontmlType.TypeDecList.ordinal()][LexType.ID.ordinal()]=				8;
	  
	  LL1Table	[NontmlType.TypeDecMore.ordinal()][LexType.VAR.ordinal()]=				9;
	  LL1Table	[NontmlType.TypeDecMore.ordinal()][LexType.PROCEDURE.ordinal()]=		9;
	  LL1Table	[NontmlType.TypeDecMore.ordinal()][LexType.BEGIN.ordinal()]=			9;

	  
	  LL1Table	[NontmlType.TypeDecMore.ordinal()][LexType.ID.ordinal()]=				10;
	  
	  LL1Table	[NontmlType.TypeId.ordinal()][LexType.ID.ordinal()]=					11;
	  
	  LL1Table	[NontmlType.TypeName.ordinal()][LexType.INTEGER.ordinal()]=			12;
	  LL1Table	[NontmlType.TypeName.ordinal()][LexType.CHAR.ordinal()]=				12;
	  
	  LL1Table	[NontmlType.TypeName.ordinal()][LexType.ARRAY.ordinal()]=				13;
	  LL1Table	[NontmlType.TypeName.ordinal()][LexType.RECORD.ordinal()]=				13;
	  
	  LL1Table	[NontmlType.TypeName.ordinal()][LexType.ID.ordinal()]=					14;
	  
	  LL1Table	[NontmlType.BaseType.ordinal()][LexType.INTEGER.ordinal()]=			15;
	  
	  LL1Table	[NontmlType.BaseType.ordinal()][LexType.CHAR.ordinal()]=				16;
	  
	  LL1Table	[NontmlType.StructureType.ordinal()][LexType.ARRAY.ordinal()]=			17;
	  
	  LL1Table	[NontmlType.StructureType.ordinal()][LexType.RECORD.ordinal()]=		18;
	  
	  LL1Table	[NontmlType.ArrayType.ordinal()][LexType.ARRAY.ordinal()]=				19;
	  
	  LL1Table	[NontmlType.Low.ordinal()][LexType.INTC.ordinal()]=					20;

	  LL1Table	[NontmlType.Top.ordinal()][LexType.INTC.ordinal()]=					21;

	  LL1Table	[NontmlType.RecType.ordinal()][LexType.RECORD.ordinal()]=				22;
	  
	  LL1Table	[NontmlType.FieldDecList.ordinal()][LexType.INTEGER.ordinal()]=		23;
	  LL1Table	[NontmlType.FieldDecList.ordinal()][LexType.CHAR.ordinal()]=			23;
	  
	  LL1Table	[NontmlType.FieldDecList.ordinal()][LexType.ARRAY.ordinal()]=			24;
	  
	  LL1Table	[NontmlType.FieldDecMore.ordinal()][LexType.END.ordinal()]=			25;
	  
	  LL1Table	[NontmlType.FieldDecMore.ordinal()][LexType.INTEGER.ordinal()]=		26;
	  LL1Table	[NontmlType.FieldDecMore.ordinal()][LexType.CHAR.ordinal()]=			26;
	  LL1Table	[NontmlType.FieldDecMore.ordinal()][LexType.ARRAY.ordinal()]=			26;
	  
	  LL1Table	[NontmlType.IdList.ordinal()][LexType.ID.ordinal()]=					27;
	  
	  LL1Table	[NontmlType.IdMore.ordinal()][LexType.SEMI.ordinal()]=					28;
	  
	  LL1Table	[NontmlType.IdMore.ordinal()][LexType.COMMA.ordinal()]=				29;
	  
	  LL1Table	[NontmlType.VarDec.ordinal()][LexType.PROCEDURE.ordinal()]=			30;
	  LL1Table	[NontmlType.VarDec.ordinal()][LexType.BEGIN.ordinal()]=				30;
	  
	  LL1Table	[NontmlType.VarDec.ordinal()][LexType.VAR.ordinal()]=					31;
	  
	  LL1Table	[NontmlType.VarDeclaration.ordinal()][LexType.VAR.ordinal()]=			32;
	  
	  LL1Table	[NontmlType.VarDecList.ordinal()][LexType.INTEGER.ordinal()]=			33;
	  LL1Table	[NontmlType.VarDecList.ordinal()][LexType.CHAR.ordinal()]=			33;
	  LL1Table	[NontmlType.VarDecList.ordinal()][LexType.ARRAY.ordinal()]=			33;
	  LL1Table	[NontmlType.VarDecList.ordinal()][LexType.RECORD.ordinal()]=			33;
	  LL1Table	[NontmlType.VarDecList.ordinal()][LexType.ID.ordinal()]=				33;
	  
	  LL1Table	[NontmlType.VarDecMore.ordinal()][LexType.PROCEDURE.ordinal()]=		34;
	  LL1Table	[NontmlType.VarDecMore.ordinal()][LexType.BEGIN.ordinal()]=			34;

	  
	  LL1Table	[NontmlType.VarDecMore.ordinal()][LexType.INTEGER.ordinal()]=			35;
	  LL1Table	[NontmlType.VarDecMore.ordinal()][LexType.CHAR.ordinal()]=				35;
	  LL1Table	[NontmlType.VarDecMore.ordinal()][LexType.ARRAY.ordinal()]=			35;
	  LL1Table	[NontmlType.VarDecMore.ordinal()][LexType.RECORD.ordinal()]=			35;
	  LL1Table	[NontmlType.VarDecMore.ordinal()][LexType.ID.ordinal()]=				35; 
	  
	  LL1Table	[NontmlType.VarIdList.ordinal()][LexType.ID.ordinal()]=				36;
	  
	  LL1Table	[NontmlType.VarIdMore.ordinal()][LexType.SEMI.ordinal()]=				37;
	  
	  LL1Table	[NontmlType.VarIdMore.ordinal()][LexType.COMMA.ordinal()]=				38;
	  
	  LL1Table	[NontmlType.ProcDec.ordinal()][LexType.BEGIN.ordinal()]=				39;
	  
	  LL1Table	[NontmlType.ProcDec.ordinal()][LexType.PROCEDURE.ordinal()]=			40;
	  
	  LL1Table	[NontmlType.ProcDeclaration.ordinal()][LexType.PROCEDURE.ordinal()]=	41;

	  LL1Table  [NontmlType.ProcDecMore.ordinal()][LexType.BEGIN.ordinal()]=			42;

	  LL1Table  [NontmlType.ProcDecMore.ordinal()][LexType.PROCEDURE.ordinal()]=		43;
	  
	  LL1Table	[NontmlType.ProcName.ordinal()][LexType.ID.ordinal()]=					44;
	  
	  LL1Table	[NontmlType.ParamList.ordinal()][LexType.RPAREN.ordinal()]=			45;
	  
	  LL1Table	[NontmlType.ParamList.ordinal()][LexType.INTEGER.ordinal()]=			46;
	  LL1Table	[NontmlType.ParamList.ordinal()][LexType.CHAR.ordinal()]=				46;
	  LL1Table	[NontmlType.ParamList.ordinal()][LexType.ARRAY.ordinal()]=				46;
	  LL1Table	[NontmlType.ParamList.ordinal()][LexType.RECORD.ordinal()]=			46;
	  LL1Table	[NontmlType.ParamList.ordinal()][LexType.ID.ordinal()]=				46;
	  LL1Table	[NontmlType.ParamList.ordinal()][LexType.VAR.ordinal()]=				46;
	  

⌨️ 快捷键说明

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