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:
#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:
相关文章推荐
- Tiny语言编译器开发之词法分析
- Tiny语言编译器开发之词法分析(利…
- Tiny语言编译器开发之语法分析
- Tiny语言编译器开发之语法分析(利…
- 手工打造编译器之语义分析2
- Tiny语言编译器简介
- 自己动手写编译器之Tiny语言语法分析器的实现
- Tiny语言编译器之TM虚拟机开发
- 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )
- Tiny语言编译器之TM虚拟机接口
- Tiny语言编译器和TM虚拟机的实现(1)
- Tiny语言编译器:Tiny语法分析器模块
- Tiny语言编译器之代码生成
- JAVA实现一个简单的代数运算语言编译器(三)--词法分析
- C--语言编译器语法分析完成,小小的记录一下
- 编译器之语义分析
- ZZZ语言的语义分析,第一步,解析Specifier(上)
- 扩展iQuery使其支持多种编程语言(三) – 兼编译器的语义分析简介
- Tiny语言编译器简单介绍
- Java语言语法语义分析器设计与实现