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

📄 util.c

📁 Tinyc是很出名的C编译器开发实例
💻 C
字号:
/****************************************************//* 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 THEN:    case ELSE:    case END:    case REPEAT:    case UNTIL:    case READ:    case WRITE:      fprintf(listing,         "reserved word: %s\n",tokenString);      break;    case ASSIGN: fprintf(listing,":=\n"); break;    case LT: fprintf(listing,"<\n"); break;    case EQ: fprintf(listing,"=\n"); break;    case LPAREN: fprintf(listing,"(\n"); break;    case RPAREN: fprintf(listing,")\n"); break;    case SEMI: 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,"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);  }}/* Function newStmtNode creates a new statement * node for syntax tree construction */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;}/* Function newExpNode creates a new expression  * node for syntax tree construction */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;    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 = malloc(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 RepeatK:          fprintf(listing,"Repeat\n");          break;        case AssignK:          fprintf(listing,"Assign to: %s\n",tree->attr.name);          break;        case ReadK:          fprintf(listing,"Read: %s\n",tree->attr.name);          break;        case WriteK:          fprintf(listing,"Write\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:          fprintf(listing,"Const: %d\n",tree->attr.val);          break;        case IdK:          fprintf(listing,"Id: %s\n",tree->attr.name);          break;        default:          fprintf(listing,"Unknown ExpNode 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 + -