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: