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

📄 util.cpp

📁 CMinus 小型编译器的词法分析与语法分析部分
💻 CPP
字号:
/****************************************************/
/* File: util.c                                     */
/* Utility function implementation                  */
/* for the TINY compiler                            */
/* Compiler Construction: Principles and Practice   */
/* Kenneth C. Louden                                */
/****************************************************/

#include "globals.h"
#include "util.h"

/* Procedure printToken prints a token 
 * and its lexeme to the listing file
 */
void printToken( TokenType token, const char* tokenString )
{ switch (token)
  { case IF:
    case ELSE:
	case WHILE:
	case RETURN:
	case INT:
	case VOID:
      fprintf(listing,
         "reserved word: %s\n",tokenString);
      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 LT: fprintf(listing,"<\n"); break;
    case LTEQ: fprintf(listing,"<=\n"); break;
	case GT: fprintf(listing,">\n"); break;
	case GTEQ: fprintf(listing,">=\n"); break;
    case EQ: fprintf(listing,"==\n"); break;
	case NOEQ: fprintf(listing,"!=\n"); break;
	case ASSIGN: fprintf(listing,"=\n"); break;
	case SEMI: fprintf(listing,";\n"); break;
	case COMMA: fprintf(listing,",\n"); break;
    case LPAREN: fprintf(listing,"(\n"); break;
    case RPAREN: fprintf(listing,")\n"); break;
	case LBRA: fprintf(listing,"[\n"); break;
    case RBRA: fprintf(listing,"]\n"); break;
	case LBRACE: fprintf(listing,"{\n"); break;
	case RBRACE: fprintf(listing,"}\n"); break;
    case ENDFILE: fprintf(listing,"EOF\n"); break;
    case NUM:
      fprintf(listing,"NUM, 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: /* should never happen */
      fprintf(listing,"Unknown token: %d\n",token);
  }
}

TreeNode * newStmtNode(StmtKind kind)
{ TreeNode * t = (TreeNode *) malloc(sizeof(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;
}


TreeNode * newExpNode(ExpKind kind)
{ TreeNode * t = (TreeNode *) malloc(sizeof(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;
  }
  return t;
}

TreeNode * newParamNode(ParamKind kind)
{
	TreeNode * t = (TreeNode *) malloc(sizeof(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 = ParamK;
		t->kind.param = kind;
		t->lineno = lineno;
	}
	return t;
}
TreeNode * newDecNode()
{
	TreeNode * t = (TreeNode *) malloc(sizeof(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 = DecK;
		t->lineno = lineno;
	}
	return t;
}

char * copyString(char * s)
{ int n;
  char * t;
  if (s==NULL) return NULL;
  n = (int)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 IterationK:
          fprintf(listing,"While\n");
          break;
        case SelectionK:
          fprintf(listing,"Selection\n");
          break;
		case CompoundK:
		  fprintf(listing,"Compound\n");
		  break;
		case ReturnK:
		  fprintf(listing,"Return\n");
		  break;
		case ExpressionK:
		  fprintf(listing,"Expression\n");
		  break;
        default:
          fprintf(listing,"Unknown ExpNode statement 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:
          fprintf(listing,"Const: %d\n",tree->attr.val);
          break;
        case IdK:
          fprintf(listing,"Id: %s\n",tree->attr.name);
          break;
		case CallK:
	      fprintf(listing,"call: %s\n",tree->attr.name);
		  break;
        default:
          fprintf(listing,"Unknown ExpNode expression kind\n");
          break;
      }
    }
	else if (tree->nodekind == DecK)
	{
		switch(tree->kind.dec) {
			case VarK:
				fprintf(listing,"Var_dec: ");
				fprintf(listing," %s\n",tree->attr.name);
				break;
			case ArrayK:
				fprintf(listing,"Array_dec: ");
				fprintf(listing," %s\n",tree->attr.name);
			case FunK:
				fprintf(listing,"Fun_dec: ");
				fprintf(listing," %s\n",tree->attr.name);
				break;
			default:
				fprintf(listing,"Unknown declaration kind\n");
				break;
		}
	}
	else if (tree->nodekind == ParamK)
	{
		switch(tree->kind.param) {
			case Var: 
				fprintf(listing,"%s %s\n",tree->attr.type,tree->attr.name);
				break;
			case Array:
				fprintf(listing,"%s %s\n",tree->attr.type,tree->attr.name);
				break;
			case Null:
				fprintf(listing,"param void\n");
				break;
			default:
				fprintf(listing,"Unknown params kind\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 + -