📄 byylscanner.java
字号:
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 + -