📄 xunh.java
字号:
/*处理语句序列*/
while (t!=null)
{
/*调用语句处理函数*/
StatementA(t);
t= t.sibling;
}
}
/****************************************************/
/* 函数名 StatementA */
/* 功 能 语句处理函数 */
/* 说 明 根据语句的具体类型,分别调用相应的 */
/* 语句处理函数 */
/****************************************************/
void StatementA(TreeNode t)
{
if (t.kind.equals("AssignK"))
AssignSA(t);
else if (t.kind.equals("CallK"))
CallSA(t);
else if (t.kind.equals("ReadK"))
ReadSA(t);
else if (t.kind.equals("WriteK"))
WriteSA(t);
else if (t.kind.equals("IfK"))
IfSA(t);
else if (t.kind.equals("WhileK"))
WhileSA(t);
else if (t.kind.equals("ReturnK"))
ReturnSA(t);
else
AnalyzeError(t," bug:no this statement in syntax tree ",null);
}
/****************************************************/
/* 函数名 AssignSA */
/* 功 能 赋值语句处理函数 */
/* 说 明 检查左部标识符,调用表达式处理函数, */
/* 并检查标识符未声明错,非期望标识符错, */
/* 赋值不兼容错 */
/****************************************************/
void AssignSA(TreeNode t)
{
SymbTable entry = new SymbTable();
boolean present = false;
TypeIR ptr = null;
TypeIR Eptr = null;
TreeNode child1;
TreeNode child2;
child1 = t.child[0];
child2 = t.child[1];
if(child1.child[0]==null)
{
/*在符号表中查找此标识符*/
present = FindEntry(child1.name[0],entry);
if(present)
{ /*id不是变量*/
if (!(entry.attrIR.kind.equals("varkind")))
{
AnalyzeError(t," left and right is not compatible in assign ",null); Eptr = null;
}
else
{
Eptr = entry.attrIR.idtype;
child1.table[0] = entry;
}
}
else /*标识符无声明*/
AnalyzeError(t,"is not declarations!",child1.name[0]);
}
else/*Var0[E]的情形*/
{
if(child1.attr.expAttr.varkind.equals("ArrayMembV"))
Eptr = arrayVar(child1);
else /*Var0.id的情形*/
if(child1.attr.expAttr.varkind.equals("FieldMembV"))
Eptr = recordVar(child1);
}
if(Eptr != null)
{
if((t.nodekind.equals("StmtK"))&&(t.kind.equals("AssignK")))
{
/*检查是不是赋值号两侧 类型等价*/
ptr = Expr(child2,null);
if (!Compat(ptr,Eptr))
AnalyzeError(t,"ass_expression error!",child2.name[0]);
}
/*赋值语句中不能出现函数调用*/
}
}
/***********************************************************/
/* 函数名 Compat */
/* 功 能 判断类型是否相容 */
/* 说 明 由于TINY语言中只有整数类型、字符类型、数组类型和 */
/* 记录类型,故类型相容等于类型等价,只需判断每个结 */
/* 构类型的内部表示产生的指针值是否相同即可。 */
/***********************************************************/
boolean Compat(TypeIR tp1,TypeIR tp2)
{
boolean present;
if (tp1!=tp2)
present = false; /*类型不等*/
else
present = true; /*类型等价*/
return present;
}
/************************************************************/
/* 函数名 Expr */
/* 功 能 该函数处理表达式的分析 */
/* 说 明 表达式语义分析的重点是检查运算分量的类型相容性, */
/* 求表达式的类型。其中参数Ekind用来表示实参是变参 */
/* 还是值参。 */
/************************************************************/
TypeIR Expr(TreeNode t,String Ekind)
{
boolean present = false;
SymbTable entry = new SymbTable();
TypeIR Eptr0=null;
TypeIR Eptr1=null;
TypeIR Eptr = null;
if(t!=null)
{
if(t.kind.equals("ConstK"))
{
Eptr = intptr;
Eptr.kind = "intTy";
if(Ekind!=null)
Ekind = "dir"; /*直接变量*/
}
else if(t.kind.equals("VariK"))
{
/*Var = id的情形*/
if(t.child[0]==null)
{
/*在符号表中查找此标识符*/
present = FindEntry(t.name[0],entry);
t.table[0] = entry;
if(present)
{ /*id不是变量*/
if (!(entry.attrIR.kind.equals("varkind")))
{
AnalyzeError(t," syntax bug: no this kind of exp ",t.name[0]); Eptr = null;
}
else
{
Eptr = entry.attrIR.idtype;
if (Ekind!=null)
Ekind = "indir"; /*间接变量*/
}
}
else /*标识符无声明*/
AnalyzeError(t,"is not declarations!",t.name[0]);
}
else/*Var = Var0[E]的情形*/
{
if(t.attr.expAttr.varkind.equals("ArrayMembV"))
Eptr = arrayVar(t);
/*Var = Var0.id的情形*/
else if(t.attr.expAttr.varkind.equals("FieldMembV"))
Eptr = recordVar(t);
}
}
else if(t.kind.equals("OpK"))
{
/*递归调用儿子节点*/
Eptr0 = Expr(t.child[0],null);
if(Eptr0==null)
return null;
Eptr1 = Expr(t.child[1],null);
if(Eptr1==null)
return null;
/*类型判别*/
present = Compat(Eptr0,Eptr1);
if (present)
{
if((t.attr.expAttr.op.equals("LT"))||(t.attr.expAttr.op.equals("EQ")))
Eptr = boolptr;
else if((t.attr.expAttr.op.equals("PLUS"))||(t.attr.expAttr.op.equals("MINUS"))||(t.attr.expAttr.op.equals("TIMES"))||(t.attr.expAttr.op.equals("OVER")))
Eptr = intptr;
/*算数表达式*/
if(Ekind != null)
Ekind = "dir"; /*直接变量*/
}
else
AnalyzeError(t,"operator is not compat!",null);
}
}
return Eptr;
}
/************************************************************/
/* 函数名 arrayVar */
/* 功 能 该函数处理数组变量的下标分析 */
/* 说 明 检查var := var0[E]中var0是不是数组类型变量,E是不*/
/* 是和数组的下标变量类型匹配。 */
/************************************************************/
TypeIR arrayVar(TreeNode t)
{
boolean present = false;
SymbTable entry = new SymbTable();
TypeIR Eptr0=null;
TypeIR Eptr1=null;
TypeIR Eptr = null;
/*在符号表中查找此标识符*/
present = FindEntry(t.name[0],entry);
t.table[0] = entry;
/*找到*/
if(present)
{
/*Var0不是变量*/
if (!(entry.attrIR.kind.equals("varkind")))
{
AnalyzeError(t,"is not variable error!",t.name[0]);
Eptr = null;
}
/*Var0不是数组类型变量*/
else if(entry.attrIR.idtype!=null)
{
if(!(entry.attrIR.idtype.kind.equals("arrayTy")))
{
AnalyzeError(t,"is not array variable error !",t.name[0]);
Eptr = null;
}
else
{
/*检查E的类型是否与下标类型相符*/
Eptr0 = entry.attrIR.idtype.array.indexTy;
if(Eptr0==null)
return null;
Eptr1 = Expr(t.child[0],null);//intPtr;
if(Eptr1==null)
return null;
present = Compat(Eptr0,Eptr1);
if(!present)
{
AnalyzeError(t,"type is not matched with the array member error !",null);
Eptr = null;
}
else
Eptr = entry.attrIR.idtype.array.elementTy;
}
}
}
else/*标识符无声明*/
AnalyzeError(t,"is not declarations!",t.name[0]);
return Eptr;
}
/************************************************************/
/* 函数名 recordVar */
/* 功 能 该函数处理记录变量中域的分析 */
/* 说 明 检查var:=var0.id中的var0是不是记录类型变量,id是 */
/* 不是该记录类型中的域成员。 */
/************************************************************/
TypeIR recordVar(TreeNode t)
{
boolean present = false;
boolean result = false;
SymbTable entry = new SymbTable();
TypeIR Eptr0=null;
TypeIR Eptr1=null;
TypeIR Eptr = null;
FieldChain currentP = new FieldChain();
/*在符号表中查找此标识符*/
present = FindEntry(t.name[0],entry);
t.table[0] = entry;
/*找到*/
if(present)
{
/*Var0不是变量*/
if (!(entry.attrIR.kind.equals("varkind")))
{
AnalyzeError(t,"is not variable error!",t.name[0]);
Eptr = null;
}
/*Var0不是记录类型变量*/
else if(!(entry.attrIR.idtype.kind.equals("recordTy")))
{
AnalyzeError(t,"is not record variable error!",t.name[0]);
Eptr = null;
}
else/*检查id是否是合法域名*/
{
Eptr0 = entry.attrIR.idtype;
currentP = Eptr0.body;
while((currentP!=null)&&(!result))
{
result = t.child[0].name[0].equals(currentP.id);
/*如果相等*/
if(result)
Eptr = currentP.unitType;
else
currentP = currentP.next;
}
if(currentP==null)
if(!result)
{
AnalyzeError(t,"is not field type!",t.child[0].name[0]); Eptr = null;
}
/*如果id是数组变量*/
else if(t.child[0].child[0]!=null)
Eptr = arrayVar(t.child[0]);
}
}
else/*标识符无声明*/
AnalyzeError(t,"is not declarations!",t.name[0]);
return Eptr;
}
/****************************************************/
/* 函数名 CallSA */
/* 功 能 函数调用语句处理函数 */
/* 说 明 检查非函数标识符错,调用检查形实参是否 */
/* 相容函数 */
/****************************************************/
void CallSA(TreeNode t)
{
String Ekind=" ";
boolean present = false;
SymbTable entry=new SymbTable();
TreeNode p = null;
/*用id检查整个符号表*/
present = FindEntry(t.child[0].name[0],entry);
t.child[0].table[0] = entry;
/*未查到表示函数无声明*/
if (!present)
AnalyzeError(t,"function is not declarationed!",t.child[0].name[0]);
else
/*id不是函数名*/
if (!(entry.attrIR.kind.equals("prockind")))
AnalyzeError(t,"is not function name!",t.child[0].name[0]);
else/*形实参匹配*/
{
p = t.child[1];
/*paramP指向形参符号表的表头*/
ParamTable paramP = entry.attrIR.proc.param;
while((p!=null)&&(paramP!=null))
{
SymbTable paraEntry = paramP.entry;
TypeIR Etp = Expr(p,Ekind);/*实参*/
/*参数类别不匹配*/
if ((paraEntry.attrIR.var.access.equals("indir"))&&(Ekind.equals("dir")))
AnalyzeError(t,"param kind is not match!",null);
/*参数类型不匹配*/
else if((paraEntry.attrIR.idtype)!=Etp)
AnalyzeError(t,"param type is not match!",null);
p = p.sibling;
paramP = paramP.next;
}
/*参数个数不匹配*/
if ((p!=null)||(paramP!=null))
AnalyzeError(t,"param num is not match!",null);
}
}
/****************************************************/
/* 函数名 ReadSA */
/* 功 能 读语句处理函数 */
/* 说 明 检查标识符未声明错,非变量标识符错 */
/****************************************************/
void ReadSA(TreeNode t)
{
SymbTable Entry=new SymbTable();
boolean present=false;
/*查找变量标识符*/
present = FindEntry(t.name[0],Entry);
/*变量在符号表中的地址写入语法树*/
t.table[0] = Entry;
if (!present) /*检查标识符未声明错*/
AnalyzeError(t," id no declaration in read ",t.name[0]);
else if (!(Entry.attrIR.kind.equals("varkind"))) /*检查非变量标识符错*/
AnalyzeError(t," not var id in read statement ", null);
}
/****************************************************/
/* 函数名 WriteSA */
/* 功 能 写语句处理函数 */
/* 说 明 调用表达式处理函数,检查语义错误 */
/****************************************************/
void WriteSA(TreeNode t)
{
TypeIR Etp = Expr(t.child[0],null);
if(Etp!=null)
/*如果表达式类型为bool类型,报错*/
if (Etp.kind.equals("boolTy"))
AnalyzeError(t,"exprssion type error!",null);
}
/****************************************************/
/* 函数名 IfSA */
/* 功 能 条件语句处理函数 */
/* 说 明 检查非布尔表达式错,并调用语句序列函数 */
/* 处理then部分和 else 部分 */
/****************************************************/
void If
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -