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

📄 byylscanner.java

📁 S语言编译器的完整实现
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
		default:anaError(11); 
		        return -1;
	}
	if(rtn==-1)
	   return rtn;
	if(code==52)
	{
		lineOfPro++;
		getNextToken();
		if((code==34)||(code==25)||(code==32)||(code==14)||(code==13)) //标识符 if for while repeat 
		 {
		 	if(code==34)
		 	   isChange=1;
		 	else
		 	   isChange=0;
		 	rtn=sentenceAnalize();
		 }
		
	}
	else
	   {
	   	anaError(3);
	   	return -1;
	   	}
	return rtn;
}
/**
 *赋值语句的分析
 *@return -1 表示出错<br>
 *     非 -1 表示算术表达式生成的第一个四元式的序号
 *@see #exprAnalize()
 */
public int startEvaluate()
{
	int addr,flag=0,rtn=lineOfEqu;
	initStack();
	
	 addr=address;          //变量的入口地址
	 getNextToken();
	 if(code==51)
	  {
	 	flag=exprAnalize();  //返回的是入口地址
	 	if(flag!=-1) 
	 	 {
	 	 	if(flag==-2)
	 	 	{ 
	 	 	   switch(code)
	 	 	   {
	 	 	   	
	 	 	   	 case 29:
	 	 	   	        equPush(new String(":="),-2,-1,addr);
	 	 	   	        if(symbolList[addr].type.toString().equals(new String("布尔")))
	 	 	   	                   symbolList[addr].val.append("true");
	 	 	   	        else
	 	 	   	             {anaError(30);return -1;} 
	 	 	   	        break;     
	 	 	   	 case 12:
	 	 	   	        equPush(new String(":="),-3,-1,addr);
	 	 	   	        if(symbolList[addr].type.toString().equals(new String("布尔")))
	 	 	   	                   symbolList[addr].val.append("false");
	 	 	   	        else
	 	 	   	             {anaError(30);return -1;}
	 	 	   	        break;                                      
	 	 	   }
	 	 	   getNextToken();
	 	 	 
	 	 	}
	 	 	else
	 	 	{
	 	 		equPush(new String(":="),flag,-1,addr);//返回的是序号
	 		    if((flag>0)&&(flag<TEMPBOUNDARY)&&(isChange==1))
	 		       if((symbolList[flag].name.start==0)&&(symbolList[flag].name.length==0))
	 		         symbolList[addr].val.append(symbolList[flag].val.toString());
	 	 	}
	 		
	 	 }
	 	 else
	 	  return -1;
	  }
	  else
	   {anaError(12); return -1;}
	
   
   return rtn;	 
}
/**
 *算术表达式的分析
 *@return  -1 表示出错<br>
 *      非 -1 表示结果所存放的地址
 */
public int exprAnalize()
{
	int ans=0;
	nowAddr=0;
	if(exprInit()==-2)
	    return -2;
	ans=mayAddSub();
	if((ans!=-1)&&(expr[nowAddr].addr!=0))
	   {anaError(12);return -1;}
	return ans;
}
/**
 *清空堆栈后将算术表达式按顺序压入堆栈
 *@return 0 表示是算术表达式并成功入栈<br>
 *        -2 表示是布尔表达式的赋值      
 */
public int  exprInit()  
{
	int i;
	pos=0;
	
	for(i=0;i<EXP_LEN;i++)
	{
		expr[i].addr=0;
		expr[i].cod=0;
	}
	i=1;
	while(i>0)
	{
		getNextToken();
		if(((code==12)||(code==29))&&(i==1))
		    return -2;
		switch(code)
		{
			case 34:push();break;//字符串
			case 35:push();break;//整数
			case 36:push();break;//实数
			case 39:push();break;//(
			case 40:push();break;//)
			case 41:push();break;//*
			case 43:push();break;//+
			case 45:push();break;//-
			case 48:push();break;// /
			default:i=-2;break;
		}
		i++;
	}
	return 0;
}
/**
 *先匹配乘除,再匹配加减运算
 *@return  -1 表示出错<br>
 *      非 -1 表示结果所存放的地址
 *@see #mayMulDiv()
 *@see #isAddSub(int)
 */
public int mayAddSub()
{
	
	int rtn=mayMulDiv();
	if(rtn!=-1)
	  rtn=isAddSub(rtn);
	return rtn;
}
/**
 *匹配是否为加减运算,是加减运算就生成相应的四元式
 *@param a 第一个操作数的入口地址 
 *@return  -1 表示出错<br>
 *      非 -1 表示结果所存放的地址
 */
public int isAddSub(int a)
{
	int rtn,t1;
	rtn=a;
	if(expr[nowAddr].cod==43||expr[nowAddr].cod==45)
	{
		int op=expr[nowAddr++].cod;
		int opr2=mayMulDiv();
		if(opr2==-1) return -1;
		t1=newTemp();
		if(op==43)
		   {
		   	 equPush(new String("+"),rtn,opr2,t1);
		   	 rtn=t1;
		   }
		   else
		   {
		   	 equPush(new String("-"),rtn,opr2,t1);
		   	 rtn=t1;
		   }
	  if(expr[nowAddr].cod==43||expr[nowAddr].cod==45) 
	                rtn=isAddSub(t1);
   }
	return rtn;
}
/**
 *先获得标识符或数字的入口地址,再调用生成乘除四元式的函数
 *@return -1 表示出错<br>
 *     非 -1 表示结果所存放的地址
 *@see #mayNumber()
 *@see #isMulDiv(int)
 */
public int mayMulDiv()
{
	
	int rtn=mayNumber();
    if(rtn!=-1)
      rtn=isMulDiv(rtn);
    return rtn;
}
/**
 *生成乘除运算的四元式
 *@param a 第一个操作数的入口地址
 *@return -1 表示出错<br>
 *     非 -1 表示结果所存放的地址
 */
public int isMulDiv(int a)
{
 int t1,rtn=a;
   if((expr[nowAddr].cod==41)||(expr[nowAddr].cod==48)) //是乘或者除
 {
     int op=expr[nowAddr++].cod;
     int opr2=mayNumber();
      if(opr2==-1) return -1;
     t1=newTemp();
     if(op==41)
     {
   	   equPush(new String("*"),rtn,opr2,t1);  
   	  rtn=t1; 	
      } 
    else
      {
   	   equPush(new String("/"),rtn,opr2,t1); 
   	   rtn=t1; 
      }
    if(expr[nowAddr].cod==41||expr[nowAddr].cod==48)
      rtn=isMulDiv(t1);
  }
  return rtn;
}
/**
 *产生一个变量地址,从5000开始
 *@return 返回一个大于5000的数
 */
public int newTemp()
{
	tempCount++;
	return tempCount;
}
/**
 *有括号则进行更深一布的调用,无括号则返回入口地址
 *@return -1 表示出错<br>
 *     非 -1 当前tokan对应的项的入口地址
 */
public int mayNumber() 
{
	int rtn=0;
	if(expr[nowAddr].cod==39) //(
	{
		nowAddr++;
		rtn=mayAddSub();
		if(expr[nowAddr++].cod!=40) //没有)
		 {anaError(13); return -1;}
	}
	else
	{
		switch(expr[nowAddr].cod)
		{
			case 34:rtn=expr[nowAddr].addr;break;//标识符
			case 35:rtn=expr[nowAddr].addr;break;//整数
			case 36:rtn=expr[nowAddr].addr;break;//实数
			case 37:rtn=expr[nowAddr].addr;break;// 字符常数
			default: anaError(12);return -1;
		}
	  nowAddr++;
	}
	return rtn;
}
/**
 *四元式入栈,其中a和b为操作数的入口地址
 *@param op 操作码
 *@param a 第一个操作数的入口地址
 *@param b 第二个操作数的入口地址
 *@param r 可能是四元式的序号,也可能是变量的入口地址
 *@return 返回刚刚生成的四元式的序号
 */
public int equPush(String  op,int a,int b,int r)
{
	int i=lineOfEqu;
	Equ[i].op.append(op);
	Equ[i].op1=a;
	Equ[i].op2=b;
	Equ[i].result=r;
	lineOfEqu++;
	return i;
}
/**
 *显示语法/语义的分析错误
 */
public void anaError(int k)
{
	if(error_count==0)
    resultTextArea.setText("语法/语义分析的结果:\n\n");
    
    switch(k)
    {
      case 1:resultTextArea.append("格式出错,第一行少program or procedure\n");break;
      case 2:resultTextArea.append("格式出错,第一行少程序名或程序名与关键字同名\n");break;
      case 3:resultTextArea.append("第"+lineOfPro+"行,缺少分号\n");break;
      case 4:resultTextArea.append("第"+lineOfPro+"行,缺少变量声明关键词var\n");break;
      case 5:resultTextArea.append("第"+lineOfPro+"行,缺少说明语句\n");break;
      case 6:resultTextArea.append("第"+lineOfPro+"行,说明语句出错\n");break;
      case 7:resultTextArea.append("第"+lineOfPro+"行,说明语句缺少分号\n");break;
      case 8:resultTextArea.append("第"+lineOfPro+"行,缺少关键词begin\n");break;
      case 9:resultTextArea.append("第"+lineOfPro+"行,begin后出现分号错误\n");break;
      case 10:resultTextArea.append("第"+lineOfPro+"行,begin和end之间无任何语句\n");break;
      case 11:resultTextArea.append("第"+lineOfPro+"行,语句出错\n");break;
      case 12:resultTextArea.append("第"+lineOfPro+"行,赋值语句出错\n");break;
      case 13:resultTextArea.append("第"+lineOfPro+"行,算术表达式缺少)\n");break;
      case 14:resultTextArea.append("第"+lineOfPro+"行,布尔表达式出错\n");break;
      case 15:resultTextArea.append("第"+lineOfPro+"行,if语句缺少then\n");break;
      case 16:resultTextArea.append("第"+lineOfPro+"行,then语句出错\n");break;
      case 17:resultTextArea.append("第"+lineOfPro+"行,else语句出错\n");break;
      case 18:resultTextArea.append("第"+lineOfPro+"行,while语句出错\n");break;
      case 19:resultTextArea.append("第"+lineOfPro+"行,do后的语句出错\n");break;
      case 20:resultTextArea.append("第"+lineOfPro+"行,repeat 语句后的表达式出错\n");break;
      case 21:resultTextArea.append("第"+lineOfPro+"行,repeat 语句的表达式缺少分号\n");break;
      case 22:resultTextArea.append("第"+lineOfPro+"行,repeat 语句缺少until\n");break;
      case 23:resultTextArea.append("第"+lineOfPro+"行,for后的表达式出错\n");break;
      case 24:resultTextArea.append("第"+lineOfPro+"行,for语句缺少to\n");break;
      case 25:resultTextArea.append("第"+lineOfPro+"行,for语句中 to 与 do之间的整数出错\n");break;
      case 26:resultTextArea.append("第"+lineOfPro+"行,for语句中缺少do\n");break;
      case 27:resultTextArea.append("第"+lineOfPro+"行,for语句中do后的语句出错\n");break;
      case 28:resultTextArea.append("第"+lineOfPro+"行,缺少end\n");break;
      case 29:resultTextArea.append("第"+lineOfPro+"行,end后缺少;或.\n");break;
      case 30:resultTextArea.append("第"+lineOfPro+"行,非布尔变量被赋予了一个布尔值\n");break;
      case 31:resultTextArea.append("第"+lineOfPro+"行,if-then-else语句then与else间语句多分号\n");break;
      case 32:resultTextArea.append("第"+lineOfPro+"行,if-then-else语句if与then间语句多分号\n");break;
      case 33:resultTextArea.append("第"+lineOfPro+"行,if语句非正常结束\n");break;
      default:resultTextArea.append("未知错误\n");break; 
    }
     error_count++;
}  	
/**
 *算术表达式或布尔表达式入栈。
 */
public void push()
{	
	expr[pos].addr=address;
	expr[pos].cod=code;
	expr[pos].name.append(ID.toString());
	pos++;
} 
/**
 *清空堆栈以存放布尔表达式或算术表达式
 */
public void initStack()
{
	int i;
	pos=0;
	nowAddr=0;
	for(i=0;i<EXP_LEN;i++)
       {
       	expr[i].addr=0;
       	expr[i].cod=0;
       	expr[i].name.delete(0,expr[i].name.length());
       }	    
}
/**
 *if语句的分析
 *@return -1 表示出错<br>
 *     非 -1 表示if语句生成的第一个四元式的序号
 */
public int startIf()
{
	int rtn=0;
	int temp=-1;
	int jumpIf;
		temp=lineOfEqu; //下一个的四元式序号
		boolInit();
		rtn=boolAnalize();
        if(rtn==-1)
            return rtn;
        if(code==52)
         {
         	if(tokenList[tokenId].code==27)
         	   anaError(32);
         	else
         	   anaError(33);
         	return -1;      
         }    
		if(code==27)   //then
		{
			getNextToken();
			lineOfPro++;
			switch(code)
			{
				case 34:isChange=0;
				        rtn=startEvaluate();
				        break;
			    case 14:isChange=0;
			            rtn=startIf();
			            break;
		        case 32:isChange=0;
		                rtn=startWhile();
		                break;
		        case 25:isChange=0;
		                rtn=startRepeat();
		                break;
		        case 13:isChange=0;
		                rtn=startFor();
		                break;
		        case  3:isChange=0;
		                rtn=beginAnalyse();
		                break;
		        default:anaError(16);
		                return -1;
		    }  
		   if(rtn==-1)
	 	        return rtn; 
		    backPatch(rtn,1);
		    if((code==52)&&(tokenList[tokenId].code==10))
		            {anaError(31);return -1;}  
		    
		  if(code==10)
			    {
			    	lineOfPro++;
			    	jumpIf=equPush(new String("j"),-1,-1,-1000);
			    	getNextToken();
			    	lineOfPro++;
			    	switch(code)
			    	{
			    	  case 34:isChange=0;
				              rtn=startEvaluate();
				              break;
			          case 14:isChange=0;
			                  rtn=startIf();
			                  break;
		              case 32:isChange=0;
		                      rtn=startWhile();
		                      break;
		              case 25:isChange=0;
		                      rtn=startRepeat();
		                      break;
		              case 13:isChange=0;
		                      rtn=startFor();
		                      break;
		              case  3:isChang

⌨️ 快捷键说明

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