📄 recursion.java
字号:
/********************************************************************/
/* 函数名 Variable */
/* 功 能 变量处理函数 */
/* 产生式 Variable ::= id VariMore */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode Variable()
{
TreeNode t = newExpNode("VariK");
if (token.Lex.equals("ID"))
{
t.name[0] = token.Sem;
t.idnum = t.idnum+1;
}
match("ID");
VariMore(t);
return t;
}
/********************************************************************/
/* 函数名 VariMore */
/* 功 能 变量处理 */
/* 产生式 VariMore ::= ε */
/* | [Exp] {[} */
/* | . FieldVar {DOT} */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
void VariMore(TreeNode t)
{
if ((token.Lex.equals("EQ"))||(token.Lex.equals("LT"))|| (token.Lex.equals("PLUS"))||(token.Lex.equals("MINUS"))|| (token.Lex.equals("RPAREN"))||(token.Lex.equals("RMIDPAREN"))|| (token.Lex.equals("SEMI"))||(token.Lex.equals("COMMA"))||
(token.Lex.equals("THEN"))||(token.Lex.equals("ELSE"))|| (token.Lex.equals("FI"))||(token.Lex.equals("DO"))||(token.Lex.equals ("ENDWH"))||(token.Lex.equals("END"))||(token.Lex.equals("ASSIGN"))|| (token.Lex.equals("TIMES"))||(token.Lex.equals("OVER"))) {}
else if (token.Lex.equals("LMIDPAREN"))
{
match("LMIDPAREN");
t.child[0] = Exp();
t.attr.expAttr.varkind = "ArrayMembV";
match("RMIDPAREN");
}
else if (token.Lex.equals("DOT"))
{
match("DOT");
t.child[0] = FieldVar();
t.attr.expAttr.varkind = "FieldMembV";
}
else
ReadNextToken();
}
/********************************************************************/
/* 函数名 FieldVar */
/* 功 能 变量处理函数 */
/* 产生式 FieldVar ::= id FieldVarMore */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode FieldVar()
{
TreeNode t = newExpNode("VariK");
if (token.Lex.equals("ID"))
{
t.name[0] = token.Sem;
t.idnum = t.idnum+1;
}
match("ID");
FieldVarMore(t);
return t;
}
/********************************************************************/
/* 函数名 FieldVarMore */
/* 功 能 变量处理函数 */
/* 产生式 FieldVarMore ::= ε| [Exp] {[} */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
void FieldVarMore(TreeNode t)
{
if ((token.Lex.equals("ASSIGN"))||(token.Lex.equals("TIMES"))|| (token.Lex.equals("EQ"))||(token.Lex.equals("LT"))|| (token.Lex.equals("PLUS"))||(token.Lex.equals("MINUS"))|| (token.Lex.equals("OVER"))||(token.Lex.equals("RPAREN"))|| (token.Lex.equals("SEMI"))||(token.Lex.equals("COMMA"))|| (token.Lex.equals("THEN"))||(token.Lex.equals("ELSE"))|| (token.Lex.equals("FI"))||(token.Lex.equals("DO"))||
(token.Lex.equals("ENDWH"))||(token.Lex.equals("END")))
{}
else if (token.Lex.equals("LMIDPAREN"))
{
match("LMIDPAREN");
t.child[0] = Exp();
t.child[0].attr.expAttr.varkind = "ArrayMembV";
match("RMIDPAREN");
}
else
ReadNextToken();
}
/********************************************************************/
/********************************************************************/
/* 函数名 match */
/* 功 能 终极符匹配处理函数 */
/* 说 明 函数参数expected给定期望单词符号与当前单词符号token相匹配 */
/* 如果不匹配,则报非期望单词语法错误 */
/********************************************************************/
void match(String expected)
{
if (token.Lex.equals(expected))
ReadNextToken();
else
{
syntaxError("not match error ");
ReadNextToken();
}
}
/************************************************************/
/* 函数名 syntaxError */
/* 功 能 语法错误处理函数 */
/* 说 明 将函数参数message指定的错误信息输出 */
/************************************************************/
void syntaxError(String s) /*向错误信息.txt中写入字符串*/
{
serror=serror+"\n>>> ERROR :"+"Syntax error at " +String.valueOf(token.lineshow)+": "+s;
/* 设置错误追踪标志Error为TRUE,防止错误进一步传递 */
Error = true;
}
/********************************************************************/
/* 函数名 ReadNextToken */
/* 功 能 从Token序列中取出一个Token */
/* 说 明 从文件中存的Token序列中依次取一个单词,作为当前单词 */
/********************************************************************/
void ReadNextToken()
{
if (fenxi.hasMoreTokens())
{
int i=1;
String stok=fenxi.nextToken();
StringTokenizer fenxi1=new StringTokenizer(stok,":,");
while (fenxi1.hasMoreTokens())
{
String fstok=fenxi1.nextToken();
if (i==1)
{
token.lineshow=Integer.parseInt(fstok);
lineno=token.lineshow;
}
if (i==2)
token.Lex=fstok;
if (i==3)
token.Sem=fstok;
i++;
}
}
}
/********************************************************
*********以下是创建语法树所用的各类节点的申请***********
********************************************************/
/********************************************************/
/* 函数名 newNode */
/* 功 能 创建语法树节点函数 */
/* 说 明 该函数为语法树创建一个新的结点 */
/* 并将语法树节点成员赋初值。 s为ProcK, PheadK, */
/* DecK, TypeK, VarK, ProcDecK, StmLK */
/********************************************************/
TreeNode newNode(String s)
{
TreeNode t=new TreeNode();
t.nodekind = s;
t.lineno = lineno;
return t;
}
/********************************************************/
/* 函数名 newStmtNode */
/* 功 能 创建语句类型语法树节点函数 */
/* 说 明 该函数为语法树创建一个新的语句类型结点 */
/* 并将语法树节点成员初始化 */
/********************************************************/
TreeNode newStmtNode(String s)
{
TreeNode t=new TreeNode();
t.nodekind = "StmtK";
t.lineno = lineno;
t.kind = s;
return t;
}
/********************************************************/
/* 函数名 newExpNode */
/* 功 能 表达式类型语法树节点创建函数 */
/* 说 明 该函数为语法树创建一个新的表达式类型结点 */
/* 并将语法树节点的成员赋初值 */
/********************************************************/
TreeNode newExpNode(String s)
{
TreeNode t=new TreeNode();
t.nodekind = "ExpK";
t.kind = s;
t.lineno = lineno;
t.attr.expAttr = new ExpAttr();
t.attr.expAttr.varkind = "IdV";
t.attr.expAttr.type = "Void";
return t;
}
/********************************************************************/
/* 函数组 */
/* 功 能 将语法树写入文件 */
/* 说 明 3个函数将不同的信息写入语法树 */
/********************************************************************/
void writeStr(String s) /*写入字符串*/
{
stree=stree+s;
}
void writeSpace() /*写空格*/
{
stree=stree+" ";
}
void writeTab(int x) /*写换行符和4个空格*/
{
stree=stree+"\n";
while (x!=0)
{ stree=stree+"\t"; x--; }
}
/******************************************************/
/* 函数名 printTree */
/* 功 能 把语法树输出,显示在文件中 */
/* 说 明 */
/******************************************************/
void printTree(TreeNode t,int l)
{
TreeNode tree=t;
while (tree!=null)
{
if (tree.nodekind.equals("ProcK"))
{
stree="ProcK";
}
else if (tree.nodekind.equals("PheadK"))
{
writeTab(1);
writeStr("PheadK");
writeSpace();
writeStr(tree.name[0]);
}
else if (tree.nodekind.equals("DecK"))
{
writeTab(l);
writeStr("DecK");
writeSpace();
if (tree.attr.procAttr!=null)
{
if (tree.attr.procAttr.paramt.equals("varparamType"))
writeStr("Var param:");
else if (tree.attr.procAttr.paramt.equals("valparamType"))
writeStr("Value param:");
}
if (tree.kind.equals("ArrayK"))
{
writeStr("ArrayK");
writeSpace();
writeStr(String.valueOf(tree.attr.arrayAttr.low));
writeSpace();
writeStr(String.valueOf(tree.attr.arrayAttr.up));
writeSpace();
if (tree.attr.arrayAttr.childtype.equals("CharK"))
writeStr("CharK");
else if(tree.attr.arrayAttr.childtype.equals("IntegerK"))
writeStr("IntegerK");
}
else if (tree.kind.equals("CharK"))
writeStr("CharK");
else if (tree.kind.equals("IntegerK"))
writeStr("IntegerK");
else if (tree.kind.equals("RecordK"))
writeStr("RecordK");
else if (tree.kind.equals("IdK"))
{
writeStr("IdK");
writeStr(tree.attr.type_name);
}
else
syntaxError("error1!");
if (tree.idnum !=0)
for (int i=0 ; i < (tree.idnum);i++)
{ writeSpace(); writeStr(tree.name[i]); }
else
syntaxError("wrong!no var!");
}
else if (tree.nodekind.equals("TypeK"))
{
writeTab(l);
writeStr("TypeK");
}
else if (tree.nodekind.equals("VarK"))
{
writeTab(l);
writeStr("VarK");
}
else if (tree.nodekind.equals("ProcDecK"))
{
writeTab(l);
writeStr("ProcDecK");
writeSpace();
writeStr(tree.name[0]);
}
else if (tree.nodekind.equals("StmLK"))
{
writeTab(l);
writeStr("StmLK");
}
else if (tree.nodekind.equals("StmtK"))
{
writeTab(l);
writeStr("StmtK");
writeSpace();
if (tree.kind.equals("IfK"))
writeStr("If");
else if (tree.kind.equals("WhileK"))
writeStr("While");
else if (tree.kind.equals("AssignK"))
writeStr("Assign");
else if (tree.kind.equals("ReadK"))
{
writeStr("Read");
writeSpace();
writeStr(tree.name[0]);
}
else if (tree.kind.equals("WriteK"))
writeStr("Write");
else if (tree.kind.equals("CallK"))
writeStr("Call");
else if (tree.kind.equals("ReturnK"))
writeStr("Return");
else
syntaxError("error2!");
}
else if (tree.nodekind.equals("ExpK"))
{
writeTab(l);
writeStr("ExpK");
if (tree.kind.equals("OpK"))
{
writeSpace();
writeStr("Op");
writeSpace();
if (tree.attr.expAttr.op.equals("EQ"))
writeStr("=");
else if (tree.attr.expAttr.op.equals("LT"))
writeStr("<");
else if (tree.attr.expAttr.op.equals("PLUS"))
writeStr("+");
else if (tree.attr.expAttr.op.equals("MINUS"))
writeStr("-");
else if (tree.attr.expAttr.op.equals("TIMES"))
writeStr("*");
else if (tree.attr.expAttr.op.equals("OVER"))
writeStr("/");
else
syntaxError("error3!");
}
else if (tree.kind.equals("ConstK"))
{
writeSpace();
writeStr("Const");
writeSpace();
writeStr(String.valueOf(tree.attr.expAttr.val));
}
else if (tree.kind.equals("VariK"))
{
writeSpace();
writeStr("Vari");
writeSpace();
if (tree.attr.expAttr.varkind.equals("IdV"))
{
writeStr("Id");
writeSpace();
writeStr(tree.name[0]);
}
else if (tree.attr.expAttr.varkind.equals("FieldMembV"))
{
writeStr("FieldMember");
writeSpace();
writeStr(tree.name[0]);
}
else if (tree.attr.expAttr.varkind.equals("ArrayMembV"))
{
writeStr("ArrayMember");
writeSpace();
writeStr(tree.name[0]);
}
else
syntaxError("var type error!");
}
else
syntaxError("error4!");
}
else
syntaxError("error5!");
/* 对语法树结点tree的各子结点递归调用printTree过程 */
for (int i=0;i<3;i++)
printTree(tree.child[i],l+1);
/* 对语法树结点tree的各兄弟结点递归调用printTree过程 */
tree=tree.sibling;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -