Tiny語言編譯器之語義分析

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:
              

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章