util.c
上传用户:wqdrylgs
上传日期:2007-02-09
资源大小:65k
文件大小:7k
源码类别:

汇编语言

开发平台:

WINDOWS

  1. /****************************************************/
  2. /* File: util.c                                     */
  3. /* Utility function implementation                  */
  4. /* for the C_Minus compiler                         */
  5. /****************************************************/
  6. #include "globals.h"
  7. #include "util.h"
  8. #include "parse.h"
  9. void printType(Type type)
  10. {
  11. switch(type){
  12. case Void: fprintf(listing,"Void"); break;
  13. case Integer: fprintf(listing,"Integer"); break;
  14. case Float: fprintf(listing,"Float"); break;
  15. case Char: fprintf(listing,"Char"); break;
  16. case Boolean: fprintf(listing,"Boolean"); break;
  17. default: fprintf(listing,"Unknown Type"); break;
  18. }
  19. }
  20. /* procedure printToken prints a token 
  21.  * and its lexeme to the listing file
  22.  */
  23. void printToken(TokenType token, const char* tokenString )
  24. { switch (token)
  25.   { case INT:
  26. case CHAR:
  27. case FLOAT:
  28. case VOID:
  29. case IF:
  30.     case ELSE:
  31.     case WHILE:
  32.     case RETURN:
  33.       fprintf(listing,"reserved word: %sn",tokenString);
  34.       break;
  35.     case PLUS: fprintf(listing,"+n"); break;
  36.     case SUB: fprintf(listing,"-n"); break;
  37.     case MUT: fprintf(listing,"*n"); break;
  38.     case DIV: fprintf(listing,"/n"); break;
  39.     case LT: fprintf(listing,"<n"); break;
  40.     case LE: fprintf(listing,"<=n"); break;
  41.     case GT: fprintf(listing,">n"); break;
  42.     case GE: fprintf(listing,">=n"); break;
  43.     case EQ: fprintf(listing,"==n"); break;
  44.     case NEQ: fprintf(listing,"!=n"); break;
  45.     case AND: fprintf(listing,"&&n"); break;
  46.     case OR: fprintf(listing,"||n"); break;
  47.     case NOT: fprintf(listing,"!n"); break;
  48.     case ASSIGN: fprintf(listing,"=n"); break;
  49.     case SEMI: fprintf(listing,";n"); break;
  50.     case COMMA: fprintf(listing,",n"); break;
  51.     case LP: fprintf(listing,"(n"); break;
  52.     case RP: fprintf(listing,")n"); break;
  53.     case LSP: fprintf(listing,"[n"); break;
  54.     case RSP: fprintf(listing,"]n"); break;
  55.     case LFP: fprintf(listing,"{n"); break;
  56.     case RFP: fprintf(listing,"}n"); break;
  57. case ENDFILE: fprintf(listing,"EOFn"); break;
  58.     case NUM: fprintf(listing,"NUM, val= %sn",tokenString); break;
  59.     case FNUM: fprintf(listing,"FNUM, val= %sn",tokenString); break;
  60. case SCHAR: fprintf(listing,"SCHAR, val= %sn",tokenString); break;
  61.     case ID: fprintf(listing,"ID, name= %sn",tokenString); break;
  62.     case ERROR:fprintf(listing,"ERROR: %sn",tokenString); break;
  63.     default: /* should never happen */
  64.       fprintf(listing,"Unknown token: %dn",token);
  65.   }
  66. }
  67. /* function newNode creates a new treenode
  68.  * for syntax tree construction
  69.  */
  70. TreeNode * newDecNode(DecKind kind)
  71.   TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
  72.   int i;
  73.   if (t==NULL)
  74.     fprintf(listing,"Out of memory error at line %dn",lineno);
  75.   else {
  76.     for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
  77.     t->sibling = NULL;
  78.     t->nodekind = Dec;
  79.     t->lineno = lineno;
  80. t->call_stmt = 0;
  81.     t->kind.dec = kind;
  82.   }
  83.   return t;
  84. }
  85. TreeNode * newStmtNode(StmtKind kind)
  86. { TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
  87.   int i;
  88.   if (t==NULL)
  89.     fprintf(listing,"Out of memory error at line %dn",lineno);
  90.   else {
  91.     for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
  92.     t->sibling = NULL;
  93.     t->nodekind = Stmt;
  94.     t->lineno = lineno;
  95. t->call_stmt = 0;
  96. t->kind.stmt = kind;
  97.   }
  98.   return t;
  99. }
  100. TreeNode * newExpNode(ExpKind kind)
  101. { TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
  102.   int i;
  103.   if (t==NULL)
  104.     fprintf(listing,"Out of memory error at line %dn",lineno);
  105.   else {
  106.     for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
  107.     t->sibling = NULL;
  108.     t->nodekind = Exp;
  109.     t->lineno = lineno;
  110. t->call_stmt = 0;
  111. t->kind.exp = kind;
  112.   }
  113.   return t;
  114. }
  115. /* function copyString allocates and makes a new
  116.  * copy of an existing string
  117.  */
  118. char * copyString(char * s)
  119. { int n;
  120.   char * t;
  121.   if (s==NULL) return NULL;
  122.   n = strlen(s)+1;
  123.   t = malloc(n);
  124.   if (t==NULL)
  125.     fprintf(listing,"Out of memory error at line %dn",lineno);
  126.   else strcpy(t,s);
  127.   return t;
  128. }
  129. /* variable indentno is used by printTree to
  130.  * store current number of spaces to indent
  131.  */
  132. static indentno = 0;
  133. /* macros to increase/decrease indentation */
  134. #define INDENT indentno+=2
  135. #define UNINDENT indentno-=2
  136. /* printSpaces indents by printing spaces */
  137. static void printSpaces(void)
  138. { int i;
  139.   for (i=0;i<indentno;i++)
  140.     fprintf(listing," ");
  141. }
  142. /* procedure printTree prints a syntax tree to the 
  143.  * listing file using indentation to indicate subtrees
  144.  */
  145. void printTree(TreeNode * tree)
  146. { int i;
  147.   INDENT;
  148.   while (tree != NULL) {
  149. printSpaces();
  150.     
  151.     switch (tree ->nodekind) {
  152.  case Dec:
  153.  switch(tree ->kind.dec){
  154.  case VarK:
  155.           fprintf(listing,"ID_Dec Var_Type: ");
  156.   printType(tree ->type);
  157.   fprintf(listing,"n");
  158.           break;
  159.  case FunDecK:
  160.           fprintf(listing,"Fun_Dec name: %s Return_Type: ",tree->attr.name);
  161.           printType(tree ->type);
  162.   fprintf(listing,"n");
  163.   break;
  164.  case FunDefK:
  165.           fprintf(listing,"Fun_Def name: %s Return_Type: ",tree->attr.name);
  166.   printType(tree ->type);
  167.   fprintf(listing,"n");
  168.           break;
  169.          case ParamK:
  170.           fprintf(listing,"Param_Dec Param_Type: ");
  171.   printType(tree ->type);
  172.   fprintf(listing,"n");
  173.           break;
  174.          case CompK:
  175.           fprintf(listing,"Comp_Dec n");
  176.           break;
  177.  }
  178.  break;
  179.   case Stmt:
  180.  switch(tree ->kind.stmt){
  181.          case IfK:
  182.           fprintf(listing,"Ifn");
  183.           break;
  184.          case WhileK:
  185.           fprintf(listing,"Whilen");
  186.           break;
  187.          case AssignK:
  188.           fprintf(listing,"Assignn");
  189.           break;
  190.          case ReturnK:
  191.           fprintf(listing,"Returnn");
  192.           break;
  193.          case CallK:
  194.           fprintf(listing,"Call to: %sn",tree ->attr.name);
  195.           break;
  196. case ContinueK:
  197.           fprintf(listing,"Continuen");
  198.           break;
  199. case BreakK:
  200.           fprintf(listing,"breakn");
  201.           break;
  202.  }
  203.  break;
  204.   case Exp:
  205.  switch(tree->kind.exp){
  206.          case NumK:
  207. fprintf(listing,"Num_Const: %dn",tree->attr.val.i);
  208. break;
  209.  case FnumK:
  210.     fprintf(listing,"FNum_Const: %fn",tree->attr.val.f);
  211. break;
  212.          case CharK:
  213.     fprintf(listing,"Char_Const: %cn",tree->attr.val.i);
  214. break;
  215.  case IdK:
  216. fprintf(listing,"Var: %sn",tree->attr.name);
  217. break;
  218.  case NotK:
  219.  fprintf(listing,"Not: n");
  220.  break;
  221.  default:
  222.           fprintf(listing,"Op: ");
  223.           printToken(tree->attr.op,"");
  224.           break;
  225.  }
  226.  break;
  227.        default:
  228.           fprintf(listing,"Unknown treenode kindn");
  229.           break;
  230.       }
  231.     
  232.     for (i=0;i<MAXCHILDREN;i++)
  233.          printTree(tree->child[i]);
  234.     tree = tree->sibling;
  235.   }
  236.   UNINDENT;
  237. }
  238.