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: