实验任务
- 利用实验一生成的语法分析树,完成语义分析
- 参考源码
实验步骤一、符号表建立
-
收集词法分析中识别出的所有标识
-
进行排序、去重,赋予每个标识符唯一索引号
-
后续使用二分查找进行符号表的检索
/* symbol table crater */ SNode* getAllSymbol(Node* node); // 遍历语法树 void insertSymbol(char* symbol); // 插入符号到集合中 void getUnqSymbol(); // 符号去重 void sortSymbols(); // 符号排序 int cmp(const void *s1, const void *s2); // 按字母序排序 /* symbol table searcher */ int getSymbolIndex(char* name); // 二分查找符号对应的索引值
实验步骤二、确定语义分析方式
-
在递归先序遍历语法树的过程中完成语义分析
-
通过语法树节点的元素标识、子节点表示等信息确定当前产生式,并进行相应语义语义动作
-
整体框架如:
void analysisTree(Node* node, SNode* snode) { int i; for (i = 0; i < node->cnt; i++) { if (node->ch[i] != NULL) { // 先序遍历 analysisTree(node->ch[i], snode->ch[i]); } } switch (node->elem) { case Extdef : /* code */ case Specifier : /* code */ case TYPE : /* code */ /* other cases */ } }
实验步骤三、符号表填充
-
对于声明语句,将符号对应的属性信息填充至符号表中
-
对于全局符号:变量名、函数名、结构体名,在
Extdef
顶层产生式中进行插入,如case Extdef : if (node->ch[1]->elem == ExtDecList) { fillSymbols(snode->ch[0]