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

📄 util.cpp

📁 小型编译系统的源代码
💻 CPP
字号:
#include "globals.h"
#include "util.h"

/* Procedure printToken prints a token 
 * and its lexeme to the listing file
 */
 /*

ENDFILE*/
void printToken( TokenType token, const char* tokenString )
{ switch (token)
  { 
    case INT:
    case CHAR:
		case FLOAT:
		case VOID:
		case IF:
    case FOR:
    case ELSE:
		case WHILE:
   	case RETURN:
      fprintf(listing,
         "reserved word: %s\n",tokenString);
      break;
    case LT: fprintf(listing,"<\n"); break;
    case EQ: fprintf(listing,"==\n"); break;
		case LE: fprintf(listing,"<=\n"); break;
		case GT: 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 AND: fprintf(listing,"&&\n"); break;
		case OR: fprintf(listing,"||\n"); break;
		case NOT: fprintf(listing,"!\n"); break;
		case ASSIGN: fprintf(listing,":=\n"); break;
		case SEMICOLON: fprintf(listing,";\n"); break;
		case COMMA: fprintf(listing,",\n"); break;
		case LBRACKET: fprintf(listing,"[\n"); break;
		case RBRACKET: fprintf(listing,"]\n"); break;
		case LBRACE: fprintf(listing,"{\n"); break;
		case RBRACE: 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 ENDFILE: fprintf(listing,"ENDFILE\n"); break;
    case NUM:
      fprintf(listing,
          "NUM, val= %s\n",tokenString);
      break;
    case ID:
      fprintf(listing,
          "ID, name= %s\n",tokenString);
      break;
		case FLOATNUM:
			fprintf(listing,
          "FLOATNUM, val= %s\n",tokenString);
		case CONSTCHAR:
			fprintf(listing,
          "CONSTCHAR, val= %s\n",tokenString);
    case ERROR:
      fprintf(listing,
          "ERROR: %s\n",tokenString);
      break;
    default: /* should never happen */
      fprintf(listing,"Unknown token: %d\n",token);
  }
}
/* Function newStmtNode creates a new statement
 * node for syntax tree construction
 */
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;
  }
  return t;
}

/* Function newExpNode creates a new expression 
 * node for syntax tree construction
 */
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->type = Void;
  }
  return t;
}

/* Function newDeclNode creates a new declaration
 * node for syntax tree construction
 */
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->kind.decl = kind;
    t->lineno = lineno;
    t->type = Void;
  }
  return t;
}

/* Function copyString allocates and makes a new
 * copy of an existing string
 */
char * copyString(char * s)
{ int n;
  char * t;
  if (s==NULL) return NULL;
  n = strlen(s)+1;
  t = new char[n];
  if (t==NULL)
    fprintf(listing,"Out of memory error at line %d\n",lineno);
  else strcpy(t,s);
  return t;
}

/* Variable indentno is used by printTree to
 * store current number of spaces to indent
 */
static indentno = 0;

/* macros to increase/decrease indentation */
#define INDENT indentno+=2
#define UNINDENT indentno-=2

/* printSpaces indents by printing spaces */
static void printSpaces(void)
{ int i;
  for (i=0;i<indentno;i++)
    fprintf(listing," ");
}

/* procedure printTree prints a syntax tree to the 
 * listing file using indentation to indicate subtrees
 */
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 ForK:
          fprintf(listing,"for\n");
          break;
        case WhileK:
          fprintf(listing,"while\n");
          break;
        case CompoundK:
          fprintf(listing,"Compound\n");
          break;
        case ReturnK:
          fprintf(listing,"Return\n");
          break;
        default:
          fprintf(listing,"Unknown ExpNode kind\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->attr.vartype){
          case Char:	
						fprintf(listing,"Const: %c\n",tree->attr.valch);
						break;
					case Integer:
						fprintf(listing,"Const: %d\n",tree->attr.vali);
						break;
					case Float:
						fprintf(listing,"Const: %5f\n",tree->attr.valf);
						break;
          }
          break;
        case IdK:
          fprintf(listing,"Id: %s\n",tree->attr.name);
          break;
        case ArrayK:
					fprintf(listing,"ArrayK: %s\n",tree->attr.name);
					break;
				case NotK:
					fprintf(listing,"Not: ");
					break;
				case CallK:
					fprintf(listing,"Call: \n");
					break;
				case TypeK:
					switch(tree->attr.vartype){
          case Char:	
						fprintf(listing,"Type: char\n");
						break;
					case Integer:
						fprintf(listing,"Type: Integer\n");
						break;
					case Float:
						fprintf(listing,"Type: float\n");
						break;
					case Void:
						fprintf(listing,"Type: void\n");
						break;
          }
          break;
        default:
          fprintf(listing,"Unknown ExpNode kind\n");
          break;
      }
		}
		else if (tree->nodekind == DeclK)
			{
				switch(tree->kind.decl)
				{
				case VarDeclK:
					fprintf(listing,"Variable Declare\n");
					break;
				case FuncDeclK:
					fprintf(listing,"Function Declare\n");
					break;
				case FuncDefK:
					fprintf(listing,"Function Definition\n");
					break;
		//		case ArrayDeclK:
		//			fprintf(listing,"Array Declare\n");
		//			break;
				case ParamK:
					fprintf(listing,"Parameter Declare\n");
					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 + -