📄 yacc.java.svn-base
字号:
{
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 + -