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

📄 recursion.java

📁 该文件为编译器的的自顶向下分析法的代码
💻 JAVA
📖 第 1 页 / 共 4 页
字号:


/********************************************************************/
/* 函数名 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 + -