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

📄 util.cpp

📁 混合991_编译实验
💻 CPP
字号:
#include "globals.h"
#include "util.h"
#include "parse.h"

void printToken(TokenType token,const char* tokenString)
{
			switch(token)
			{
			case IF:
			case ELSE:
			case WHILE:
			case INT:
			case FLOAT:
			case CHAR:
			case BREAK:
			case RETURN:
			   fprintf(listing,"resverved word:%s\n",tokenString);
			break;

			case ASSIGN: fprintf(listing,"=\n");  break;
			case LT:     fprintf(listing,"<\n");  break;
			case EQ:     fprintf(listing,"==\n"); break;
			case GT:     fprintf(listing,">\n");  break;
			case LE:     fprintf(listing,"<=\n"); break;
			case GE:     fprintf(listing,">=\n"); break;
            case NE:     fprintf(listing,"!=\n"); break;
			case LPAREN: fprintf(listing,"(\n");  break;
			case RPAREN: fprintf(listing,")\n");  break;
			case LBRACKET:fprintf(listing,"[\n"); break;
			case RBRACKET:fprintf(listing,"]\n"); break;
			case LBC:    fprintf(listing,"{\n");  break;
			case RBC:    fprintf(listing,"}\n");  break;
			case SEMI:   fprintf(listing,";\n");  break;
			case COMMA:  fprintf(listing,",\n");  break;
			case PLUS:   fprintf(listing,"+\n");  break;
			case MINUS:  fprintf(listing,"-\n");  break;
			case TIMES:  fprintf(listing,"*\n");  break;
			case OVER:   fprintf(listing,"/\n");  break;
			case AND:    fprintf(listing,"&&\n"); break;
			case OR:     fprintf(listing,"||\n"); break;
			case NOT:    fprintf(listing,"!\n");  break;
			case ENDFILE:fprintf(listing,"EOF\n"); break;
			case CONSTCHAR:
			         fprintf(listing,"constchar,val=%s\n",tokenString);
							 break;
			case NUM:
			         fprintf(listing,"NUM, val= %s\n",tokenString);
							 break;
			case FLOATNUM:
			         fprintf(listing,"FLOATNUM,val=%s\n",tokenString);
							 break;
			case ID:
			         fprintf(listing,"ID, name=%s\n",tokenString);
							 break;
			case ERROR:
			         fprintf(listing,"ERROR, %s\n",tokenString);
							 break;
			default:
			         fprintf(listing,"Unknown token: %d\n",token);
							
			
			
			}
}

TreeNode * newStmtNode(StmtKind kind)
{
		TreeNode * t=new TreeNode;
		int i;
		if(t==NULL)
		{
			 fprintf(listing,"Out of memory error at line %d\n",lineno);
		}
		else
		{
		     for(i=0;i<MAXCHILDREN;i++)  t->child[i]=NULL;
			 t->sibling=NULL;
			 t->nodekind=StmtK;
			 t->kind.stmt=kind;
			 t->lineno=lineno;
			 t->tablep=NULL;
		}
		return t;
}

TreeNode * newExpNode(ExpKind kind)
{
        TreeNode * t=new TreeNode;
	    int i;
	    if(t==NULL)
		{
			 fprintf(listing,"Out of memory error at line %d\n",lineno);
		}
		else
		{
		     for(i=0;i<MAXCHILDREN;i++) t->child[i]=NULL;
			 t->sibling=NULL;
			 t->nodekind=ExpK;
			 t->kind.exp=kind;
			 t->lineno=lineno;
			 t->tablep=NULL;
			 t->type=Void;


		}

		return t;

}

TreeNode * newDeclNode(DeclKind kind)
{
        TreeNode * t=new TreeNode;
	    int i;
	    if(t==NULL)
		{
			 fprintf(listing,"Out of memory error at line %d\n",lineno);
		}
		else
		{
		     for(i=0;i<MAXCHILDREN;i++) t->child[i]=NULL;
			 t->sibling=NULL;
			 t->nodekind=DeclK;
			 t->lineno=lineno;
			 t->tablep=NULL;
			 t->kind.decl=kind;
			 t->type=Void;
			

		}

		return t;

}

char* copyString(char *s )
{
     int n;
		 char* t;
		 if(s==NULL)  return NULL;
		 n=strlen(s)+1;
		 t=(char*)malloc(n);
		 if(t==NULL)
		    fprintf(listing,"Out of memory error at line %d\n",lineno);
		 else strcpy(t,s);
		 return t;
}

static indentno=0;
#define INDENT indentno+=2
#define UNINDENT indentno-=2

static void printSpaces(void)
{
 int i;
 for(i=0;i<indentno;i++)
	 fprintf(listing," ");
}

void printTree(TreeNode * tree)
{
	int i;
	INDENT;
	while(tree!=NULL)
	{
	       printSpaces();
		   if(tree->nodekind==StmtK)
		   {
		           switch(tree->kind.stmt)
				   {
				   case IfK:
					   fprintf(listing,"If \n");
					   break;
				   case WhileK:
					   fprintf(listing,"While\n");
					   break;
				   case ReturnK:
					   fprintf(listing,"Return\n");
					   break;
				   case CompoundK:
					   fprintf(listing,"Compound \n");
					   break;
				   case BreakK:
					   fprintf(listing,"Break \n");
					   break;
				   case ExpStmtK:
					   fprintf(listing,"ExpStmt \n");
					   break;
				   case AssignK:
					   fprintf(listing,"AssignStmt \n");
					   break;
				   }
		   }
		   else if(tree->nodekind==ExpK)
		   {
		            switch(tree->kind.exp)
					{
					case OpK:
						fprintf(listing,"Op:  ");
						printToken(tree->attr.op,"\0");
						break;
					case ConstK:
						switch(tree->type)
						{
						case Integer:
						    fprintf(listing,"const: %d \n",tree->attr.vali);
						    break;
						case Float:
							fprintf(listing,"const: %f \n",tree->attr.valf);
							break;
						case Char:
							fprintf(listing,"const: %c  \n",tree->attr.valc);
							break;
						}
					    break;
					case IdK:
						fprintf(listing,"Id: %s \n",tree->attr.name);
						break;
					case CallK:
						fprintf(listing,"Call:%s \n",tree->attr.name);
						break;
					case ArrayK:
						fprintf(listing,"Array:%s \n ",tree->attr.name);
						break;
					default:
						fprintf(listing,"Unknown ExpNode Kind \n");
						break;

					}
		   }
		   else if(tree->nodekind==DeclK)
		   {
		             switch(tree->kind.decl)
					 {
					 case SingleVarK:
						 fprintf(listing,"Declaration SingleVar:%s \n",tree->attr.name);
						 break;
					 case ArrayVarK:
						 fprintf(listing,"Declaration ArrayVar:%s[%d] \n",tree->attr.name,tree->array_size);
						 break;
					 case FuncVarK:
						 fprintf(listing," ReturnType %d Declaration FuncVar: %s \n",tree->type,tree->attr.name);
						 break;
					 }
		   }
		   else fprintf(listing,"Unknown node kind\n");
		   for(i=0;i<MAXCHILDREN;i++)
			    printTree(tree->child[i]);
		   tree=tree->sibling;
	}
	UNINDENT;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -