1. 预处理器
1.1) 去除注释
逐行读取源码文件xxx.c到缓存中,凡是遇到‘\\’,就将它和后续字符清空。将缓存字符串逐行写入文件xxx.c.tmp。
2. 词法语法分析器
2.1) 处理流程
按照《C语言简单子集编译器功能设计书》第二章基本语法,生成语法树。
2.2) 语法树结构
参照scmpstx.h中所定义的数据结构。
2.3) DEBUG
将生成的语法树写入文件xxx.c.stx。
2.4) 异常处理
遇到语法、词法错误时,统一报如下异常:
Syntax error at line @1. @2
其中参数@1为行号,参数@2为详细出错信息。
2.5) 内存管理
使用动态内存的函数必须在退出函数时释放内存。
全局作用域的动态内存(标志符表和语法树)使用如下配对函数进行申请和释放:
initialize_XXX() release_XXX()
3. 语义分析、汇编码生成器
在Windows下生成MASM汇编码,在Linux下生成AT&T汇编码。
[ MASM ]
3.1) 汇编码的组织
3.1.1) 头部
使用如下固定内容:
.MODEL SMALL
.STACK 4096h
INCLUDE PrintVal.mac
3.1.2) 数据部
使用如下模式:
.DATA
A DW 0
Name_A DB ‘A’,20H,20H
B DW 0
Name_B DB ‘B’,20H,20H
3.1.3) 代码部
.CODE
CALL Main
Sub1 PROC
…
Sub1 ENDP
…
Main PROC
…
Main ENDP
END Main
3.2) 汇编码生成流程
(1) 生成头部固定代码。
(2) 生成数据部。遍历IdTable,生成所有变量的定义代码。生成变量名字符串Name_XXX。
&nbs