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

📄 yacc.java.svn-base

📁 北航编译原理课程设计成果——一个扩充的C0文法编译器
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
		{
			if(quater.getResult()!=null&&quater.getResult().startsWith("@"))
			{
				curfunc.getVmap().put(quater.getResult(),i*4);
				i++;
			}
		}
		checkret=true;
		funclab=0;
		return true;
	}
	
	/**
	 * <参数>
	 * @return
	 */
	private boolean parsePara()
	{
		if(lop.getType()!=Lex.Lpar)
		{
			error=true;
			errorList.add(Error.report(Error.ERR_NOTBE,lop.getLine(),"函数定义"));
			return false;
		}
		if(!next()||!parseParaTable())
		{
			error=true;
			errorList.add(Error.report(Error.ERR_ABNORMAL,lop.getLine(),null));
			return false;
		}
		if(lop.getType()!=Lex.Rpar)
		{
			error=true;
			errorList.add(Error.report(Error.ERR_ABNORMAL,lop.getLine(),null));
			return false;
		}
		next();
		return true;
	}
	
	/**
	 * <参数表>
	 * @return
	 */
	private boolean parseParaTable()
	{
		if(lop.getType()==Lex.Rpar)
		{
			return true;
		}
		do
		{
			if(!next()||lop.getType()!=Lex.IDSY)
			{
				error=true;
				errorList.add(Error.report(Error.ERR_ABNORMAL,lop.getLine(),null));
				return false;
			}
			curfunc.getPara().add(lop.getWord());
			if(next()&&lop.getType()!=Lex.COMMA)
			{
				return true;
			}
			if(!next()||lop.getType()!=Lex.INT)
			{
				error=true;
				errorList.add(Error.report(Error.ERR_ABNORMAL,lop.getLine(),null));
				return false;
			}
		}
		while(true);
	}
	
	/**
	 * <值参数表>
	 * @return
	 */
	private boolean parseValueParaTable()
	{
		String[] vTable=new String[50];
		int i=0;
		if(!parseExpression())
		{
			if(lop.getType()==Lex.Rpar)
			{
				return true;
			}
			return false;
		}

		vTable[i++]=register;
		while (lop.getType()==Lex.COMMA)
		{
			if(!next()||!parseExpression())
			{
				return false;
			}

			vTable[i++]=register;
		}

		for(i=i-1;i>=0;i--)
		{
			addQuater(PUSHPARA,vTable[i],null,null);	  //倒着推参数
		}

		return true;
	}
	
	/**
	 * <表达式>
	 * @return
	 */
	private boolean parseExpression()
	{
		int symbel=0;
		int op=1;
		if(lop.getType()==Lex.ADD||lop.getType()==Lex.MINUS)
		{
			symbel++;										//当有符号时op对应改变
			op=lop.getType()-14;
			next();
		}
		if(!parseItem())
		{
			return false;
		}
		if(symbel>0)
		{
			addQuater(op,"0",register,"@t"+ti);				//第一个项的结果与零做加或减			 
			register="@t"+ti;
			ti++;
		}
		while(lop.getType()==Lex.ADD||lop.getType()==Lex.MINUS)
		{
			String presult=register;						//存前一项的结果
			op=lop.getType()-14;
			if(!next()||!parseItem())
			{
				return false;
			}

			addQuater(op,presult,register,"@t"+ti);			//前一项的结果与该项结果做加或减 
			register="@t"+ti;
			ti++;
		}
		if(register.equals("@teax"))
		{
			addQuater(MOV,register,null,"@t"+ti);
			register="@t"+ti;
			ti++;
		}

		return true;
	}
	
	/**
	 * <项>
	 * @return
	 */
	private boolean parseItem()
	{
		int op;
		if(!parseFactor())
		{
			return false;
		}
		String presult=register;				//把前一个因子的结果存为presult
		while (lop.getType()==Lex.MUL||lop.getType()==Lex.DIV)
		{
			op=lop.getType()-14;				//把元算符号存入op
			if(!next())
			{
				return false;
			}
			if(!parseFactor())
			{
				return false;
			}

			addQuater(op,presult,register,"@t"+ti);
			register="@t"+ti;
			ti++;
			presult=register;
		}

		return true;
	}
	
	/**
	 * <因子>
	 * @return
	 */
	private boolean parseFactor()
	{
		boolean def=false;			//是否定义过的标志位
		if(lop.getType()==Lex.IDSY)
		{					//以标识符开头的要把标识符存入register,再预读一个,区分出是函数调用还是单个标识符。
			Output idsy=lop;

			if(!next()||lop.getType()!=Lex.Lpar)
			{   //预读的一个不是括号就返回标识符,是括号就判断是否为call

				//先判断是否有常量名,若有则替换为对应的数值
				
				for(Constant con:curfunc.getConst())
				{
					if(con.getName().equals(idsy.getWord()))
					{
						register=Integer.toString(con.getValue());
						def=true;
						break;
					}
				}
				for(Constant con:this.global_const)
				{
					if(def)
						break;
					if(con.getName().equals(idsy.getWord()))
					{
						register=Integer.toString(con.getValue());
						def=true;
						break;
					}
				}
				for(String para:curfunc.getPara())
				{
					if(def)
						break;
					if(para.equals(idsy.getWord()))
					{
						register=idsy.getWord();
						def=true;
						break;
					}
				}
				for(String var:curfunc.getVar())
				{
					if(def)
						break;
					if(var.equals(idsy.getWord()))
					{
						register=idsy.getWord();
						def=true;
						break;
					}
				}
				for(String var:this.global_var)
				{
					if(def)
						break;
					if(var.equals(idsy.getWord()))
					{
						register=idsy.getWord();
						def=true;
						break;
					}
				}
				
				if(!def)
				{					 //未定义的变量,报错	 
					error=true;
					errorList.add(Error.report(Error.ERR_NOTDEFINE,idsy.getLine(),idsy.getWord()));
					return false;
				}

				return true;
			}
		   //有(一定是函数调用
			register=idsy.getWord();
			for(Function func:funcList)
			{
				if(func.getName().equals(register)&&func.getRetype()==Function.R_VOID)
				{
					error=true;
					errorList.add(Error.report(Error.ERR_APPEARVOID,idsy.getLine(),idsy.getWord()));
					return false;
				}
			}
			
			if(!next()||!parseCall())
			{
				return false;
			}

			return true;
		}
		if(lop.getType()==Lex.Lpar)
		{							//当第一个是(时,判断是否是(Expression)形式的
			if(!next()||!parseExpression())
			{
				return false;
			}
			if(lop.getType()!=Lex.Rpar)
			{
				error=true;
				errorList.add(Error.report(Error.ERR_ABNORMAL,lop.getLine(),null));
				return false;
			}
			next();
			
			return true;
		}
		if(lop.getType()==Lex.INTEGER)
		{	 //若为整数就直接返回整数
			register=lop.getWord();
			next();

			return true;
		}
		
		return false;
	}
	
	/**
	 * <语句>
	 * @param jmpstart
	 * @param jmpend
	 * @return
	 */
	private boolean parseSentence(String jmpstart,String jmpend)
	{
		if (lop.getType()==Lex.SCANF)
		{
			return parseRead();
		}
		else if(lop.getType()==Lex.PRINTF)
		{
			return parseWrite();
		}
		else if(lop.getType()==Lex.RETURN)
		{
			return parseReturn();
		}
		else if(lop.getType()==Lex.IF)
		{
			return parseConditionStatement(jmpstart,jmpend);
		}
		else if(lop.getType()==Lex.WHILE)
		{
			return parseLoopStatement();
		}
		else if(lop.getType()==Lex.Lbra)
		{
			if(!next()||!parseSequance(jmpstart,jmpend))
			{
				return false;
			}
			if(lop.getType()!=Lex.Rbra)
			{
				error=true;
				errorList.add(Error.report(Error.ERR_RBRALACK,lop.getLine(),null));
				return false;
			}
			next();
			
			return true;
		}
		else if(lop.getType()==Lex.IDSY)
		{	//当以标识符开头时,可能是赋值语句也可能是函数调用,需要把标识符存入register,再预读一个来判断
			register=lop.getWord();
			if(!next())
			{
				return false;
			}
			if(lop.getType()==Lex.EQUAL)
			{
				if(!next()||!parseEvaluation())
				{
					return false;
				}
				if(lop.getType()!=Lex.SEMICOLON)
				{
					error=true;
					errorList.add(Error.report(Error.ERR_SEMILACK,lop.getLine(),null));
					return false;
				}
				next();

				return true;
			}
			if(lop.getType()==Lex.Lpar)
			{
				if(!next()||!parseCall())
				{
					return false;
				}
				if(lop.getType()!=Lex.SEMICOLON)
				{
					error=true;
					errorList.add(Error.report(Error.ERR_SEMILACK,lop.getLine(),null));
					return false;
				}
				next();

				return true;
			}
			error=true;
			errorList.add(Error.report(Error.ERR_ABNORMAL,lop.getLine(),null));
			return false;
		}
		else if(lop.getType()==Lex.BREAK)
		{
			if(jmpend==null)
			{
				error=true;
				errorList.add(Error.report(Error.ERR_OUTLOOP,lop.getLine(),"跳出语句"));
				return false;
			}
			addQuater(J,jmpend,null,null);
			
			if(!next()||lop.getType()!=Lex.SEMICOLON)
			{
				error=true;
				errorList.add(Error.report(Error.ERR_SEMILACK,lop.getLine(),null));
				return false;
			}
			next();

			return true;
		}
		else if(lop.getType()==Lex.CONTINUE)
		{
			if(jmpstart==null)
			{
				error=true;
				errorList.add(Error.report(Error.ERR_OUTLOOP,lop.getLine(),"继续语句"));
				return false;
			}
			addQuater(J,jmpstart,null,null);
			
			if(!next()||lop.getType()!=Lex.SEMICOLON)
			{
				error=true;
				errorList.add(Error.report(Error.ERR_SEMILACK,lop.getLine(),null));
				return false;
			}
			next();

			return true;
		}
		else if(lop.getType()==Lex.SEMICOLON)
		{
			next();
			return true;
		}
			
		return false;
	}
	
	/**
	 * <复合语句>
	 * @return
	 */
	private boolean parseComplex()
	{
		if(!next())
		{
			return false;
		}
		while(lop.getType()==Lex.CONST)
		{
			if(!parseConst())
			{
				return false;
			}
		}
		while(lop.getType()==Lex.INT)
		{
			if(!parseVar())
			{
				return false;
			}
		}
		if(!parseSequance(null,null))
		{
			return false;
		}
		if(lop.getType()!=Lex.Rbra)
		{
			error=true;
			errorList.add(Error.report(Error.ERR_RBRALACK,lop.getLine(),null));
			return error;
		}
		next();
		
		return true;
	}
	
	/**
	 * <语句序列>
	 * @param jmpstart
	 * @param jmpend
	 * @return
	 */
	private boolean parseSequance(String jmpstart,String jmpend)
	{
		int eno=0;

		while(parseSentence(jmpstart,jmpend))
		{
			eno++;
		}
		if(eno==0||error)
		{
			error=true;
			errorList.add(Error.report(Error.ERR_SENTLACK,lop.getLine(),null));
			return false;
		}
		
		return true;
	}
	
	/**
	 * <条件>
	 * @return
	 */
	private boolean parseCondition()
	{
		if(!parseExpression())
		{
			return false;
		}

		if(lop.getType()==Lex.Rpar)
		{														//当不是关系运算符时
			addQuater(CMP,register,"0",null);					//若条件是表达式,则让表达式结果与0比较

⌨️ 快捷键说明

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