资源简介

华南师范大学 本资源包括TINY扩充语言的语法分析的实验报告,编译原理附录B和TINY扩充语言的语法分析代码.实验报告中说明了该实验的完成步骤. 扩充的语法规则有:实现while、do while、for语句和求余计算式子,具体文法规则自行构造。 可参考:P97及P136的文法规则。 (1) While-stmt --> while exp do stmt-sequence endwhile (2) Dowhile-stmt-->do stmt-sequence while exp (3) for-stmt-->for identifier:=simple-exp to simple-exp do stmt-sequence enddo 步长递增1 (4) for-stmt-->for identifier:=simple-exp downto simple-exp do stmt-sequence enddo 步长递减1 要求: (1)要提供一个源程序编辑界面,以让用户输入源程序(可保存、打开源程序) (2)可由用户选择是否生成语法树,并可查看所生成的语法树。 (3)应该书写完善的软件文档

资源截图

代码片段和文件信息

/****************************************************/
/* File: analyze.c                                  */
/* Semantic analyzer implementation                 */
/* for the TINY compiler                            */
/* Compiler Construction: Principles and Practice   */
/* Kenneth C. Louden                                */
/****************************************************/

#include “globals.h“
#include “symtab.h“
#include “analyze.h“

/* counter for variable memory locations */
static int location = 0;

/* Procedure traverse is a generic recursive 
 * syntax tree traversal routine:
 * it applies preProc in preorder and postProc 
 * in postorder to tree pointed to by t
 */
static void traverse( TreeNode * t
               void (* preProc) (TreeNode *)
               void (* postProc) (TreeNode *) )
{ if (t != NULL)
  { preProc(t);
    { int i;
      for (i=0; i < MAXCHILDREN; i++)
        traverse(t->child[i]preProcpostProc);
    }
    postProc(t);
    traverse(t->siblingpreProcpostProc);
  }
}

/* nullProc is a do-nothing procedure to 
 * generate preorder-only or postorder-only
 * traversals from traverse
 */
static void nullProc(TreeNode * t)
{ if (t==NULL) return;
  else return;
}

/* Procedure insertNode inserts 
 * identifiers stored in t into 
 * the symbol table 
 */
static void insertNode( TreeNode * t)
{ switch (t->nodekind)
  { case StmtK:
      switch (t->kind.stmt)
      { case AssignK:
        case ReadK:
          if (st_lookup(t->attr.name) == -1)
          /* not yet in table so treat as new definition */
            st_insert(t->attr.namet->linenolocation++);
          else
          /* already in table so ignore location 
             add line number of use only */ 
            st_insert(t->attr.namet->lineno0);
          break;
        default:
          break;
      }
      break;
    case ExpK:
      switch (t->kind.exp)
      { case IdK:
          if (st_lookup(t->attr.name) == -1)
          /* not yet in table so treat as new definition */
            st_insert(t->attr.namet->linenolocation++);
          else
          /* already in table so ignore location 
             add line number of use only */ 
            st_insert(t->attr.namet->lineno0);
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}

/* Function buildSymtab constructs the symbol 
 * table by preorder traversal of the syntax tree
 */
void buildSymtab(TreeNode * syntaxTree)
{ traverse(syntaxTreeinsertNodenullProc);
  if (TraceAnalyze)
  { fprintf(listing“\nSymbol table:\n\n“);
    printSymTab(listing);
  }
}

static void typeError(TreeNode * t char * message)
{ fprintf(listing“Type error at line %d: %s\n“t->linenomessage);
  Error = TRUE;
}

/* Procedure checkNode performs
 * type checking at a single tree node
 */
static void checkNode(TreeNode * t)
{ switch (t->nodek

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件      462848  2013-01-02 21:56  TINY 扩充语言的语法分析  - 副本.doc
     文件        5161  1997-02-01 09:33  编译原理附录B\YACC\TINY.Y
     文件        3338  1997-01-31 22:48  编译原理附录B\YACC\GLOBALS.H
     目录           0  2013-01-02 19:48  编译原理附录B\YACC\
     文件        1037  1998-08-01 14:01  编译原理附录B\UTIL.H
     文件        4848  1998-08-01 14:02  编译原理附录B\UTIL.C
     文件       14104  1998-03-20 13:40  编译原理附录B\TM.EXE
     文件       16753  1998-08-01 14:02  编译原理附录B\TM.C
     文件       40736  1998-04-26 21:47  编译原理附录B\TINY.EXE
     文件         959  1998-08-01 14:01  编译原理附录B\SYMTAB.H
     文件        3564  1998-08-01 14:02  编译原理附录B\SYMTAB.C
     文件         659  1998-08-01 14:01  编译原理附录B\SCAN.H
     文件        5733  1999-08-04 16:05  编译原理附录B\SCAN.C
     文件         263  1996-08-25 15:33  编译原理附录B\SAMPLE.TNY
     文件         920  1998-07-31 16:47  编译原理附录B\SAMPLE.TM
     文件        1962  1998-07-31 15:15  编译原理附录B\README.DOS
     文件         484  1998-08-01 14:01  编译原理附录B\PARSE.H
     文件        5173  1998-08-01 14:02  编译原理附录B\PARSE.C
     文件        1129  1998-02-03 22:29  编译原理附录B\MAKEFILE
     文件        2535  1998-08-01 14:02  编译原理附录B\MAIN.C
     文件        1995  1998-07-31 14:45  编译原理附录B\LEX\TINY.L
     目录           0  2013-01-02 19:48  编译原理附录B\LEX\
     文件        2955  1998-08-01 14:01  编译原理附录B\GLOBALS.H
     文件        2234  1998-08-01 14:01  编译原理附录B\CODE.H
     文件        3039  1998-08-01 14:02  编译原理附录B\CODE.C
     文件         679  1998-08-01 14:01  编译原理附录B\CGEN.H
     文件        6971  1998-08-01 14:02  编译原理附录B\CGEN.C
     文件         652  1998-08-01 14:01  编译原理附录B\ANALYZE.H
     文件        4452  1998-08-01 14:02  编译原理附录B\ANALYZE.C
     目录           0  2013-01-02 19:48  编译原理附录B\
     目录           0  2013-01-02 20:34  实验二\
............此处省略69个文件信息

评论

共有 条评论