main.c 语法分析器与中间代码生成器,它调用词法分析器
token_analyze 词法分析器
queue.h 队列
stack.h 栈
linklist.h 链表
data_struct.h Token数据结构
FourElemFormula 四元式相关,如四元式的数据结构、打印(到文件)函数、释放四元式内存行数
- operator.h 四元式的第一个运算符宏定义
symboltable.h 符号表管理
debug.h 打印符号表
table.h bison生成的预测分析表
code.txt Pascal源代码文件
进行其他文件的测试时将token_analyze.h文件中void ReadFile()函数中的pfile = fopen
("code.txt", "r");改成其他文件名即可
程序用到的部分数据结构
a) 栈:后进先出
b) 队列:先进先出
c) Token:符号栈中的元素
typedef struct{
int symbolnum; //符号编号
int type; //type index_listxiao
char name[64]; //id36
int i; //int37 width index_listda
float f; //float38
char s[1027]; //string39
struct idnode *addr; //赋值语句的翻译时用
struct idnode *offset; //赋值语句的翻译时用
}To;
typedef To* Token;
Token的属性域除了包含符号编号外,还包括保存词法分析器分析出来的值如常数、实数、字符串、id名等,另外的addr和offset用于赋值语句的翻译,其他域在特定符号时也会有不同的用处
d) Identifier:哈希表的节点
typedef struct idnode{ /*哈希表的节点*/
char name[64];
int type; /*类型,如int、int*等*/
int offset;
int *arrayex;
struct idnode *next_hash; /*指向下一节点的指针*/
}Identifier;
e) Subproc:子过程条目
typedef struct{
char name[64];
struct symtable* s;
}Subproc;
f) symtbl:符号表
typedef struct symtable{
struct symtable* before;
int width;
Identifier *SymbolTable[PRIME]; //哈希表,存放变量
Subproc *SubprocArray[SUBPROC_NUM];
int subprocptr;
}symtbl;
出错处理:
能处理编译过程中的词法错误并提示、定位
能处理语法错误、变量没有声明的语义错误。