您的位置:首页 > 其它

Tiny语言编译器之语义分析

2014-02-24 15:04 162 查看
Tiny语言的语义分析非常简单,第一步先遍历语法树建立符号表,但是这个符号表本身并没有太大的用处,只是为变量分配了内存的地址,为代码生成做准备;第二步是类型检查,主要对if语句、repeat语句的条件进行检查,必须是Boolean类型的,另外有些表达式要求是Integer类型,类型检查采用后序遍历的方式。语义分析的源代码如下:

#include "globals.h"
#include "symtab.h"
#include "analyze.h"
typedef void (*traverseFunc)(TreeNode*); 

//变量的内存地址
static int location = 0;

//遍历函数
static void traverse(TreeNode*t,traverseFunc preProc,traverseFunc postProc)

{

    int i;

    if(t!=NULL)

    {

        preProc(t);

        for( i=0; i< MAXCHILDREN; i++)

            traverse(t->child[i], preProc, postProc);

        postProc(t);

        traverse(t->sibling, preProc, postProc);

    }

}

//空遍历函数
static void nullProc(TreeNode* t)

{

    return;

}

//根据节点类型,建立符号表
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)

                st_insert(t->attr.name, t->lineno, location++);

              else

                st_insert(t->attr.name, t->lineno, 0); 

              break;

          default:

              
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: