目录
1 目的 4
2 设计思路与实现 4
2.1 编译过程概述 4
2.2 Flex与Bison工具的简介 5
2.2.1 Flex文件内容结构 5
2.2.2 Bison文件内容结构 6
2.2.3 Flex-Bison协作关系 6
2.2.4 结构体含义 7
2.3 文法的设计 7
3 程序实现 8
3.1 程序总体思想 8
3.2 词法分析设计 8
3.3 语法分析设计 9
3.4 抽象语法树的生成 12
3.5 AST图片的设计 13
3.6 MakeFile文件的设计 14
4 测试用例以及实验结果 15
4.1 文件测试用例 15
4.2 使用说明 15
4.3 文件测试 15
4.3.1 文件1测试 15
4.3.2 文件2测试 18
4.3.3 文件3测试 20
5 技术问题以及解决方案 22
5.1 技术问题 22
5.2 心得体会 23
6 备注 23
3程序实现
3.1程序总体思想
首先应当对使用指定文法的源文件进行词法分析,将整个文本分解为一个一个词素,然后 为每个终结符建立一个语法节点。将上述过程看作是一个解析函数,每次调用就生成语法节点 并返回词素的类型。
接着需要对其进行语法分析(事实上词法分析和语法分析是同时进行的)。使用 LR 分析技 术,按照产生式规则生成项集,然后构造项集的 goto 函数。此过程事实上完成了一个可以识别 此文法的 DFA,根据此 DFA 构造此文法的语法分析表,接着根据上一步词法分析器返回的终结 符类型来选择执行移入或规约的动作,在规约的同时生成新的语法节点并使其与子语法节点建 立连接关系。重复以上直到状态栈中的状态达到 Acc 也就是接收状态,说明输入字符串被此文 法接收。
上述动作执行完毕后,即构造出一棵完整的抽象语法树。
3.2词法分析设计
词法分析过程借助GNU Flex工具使用正则表达式描述每一个单词的组成,即Flex会为每一个单词构建相应的DFA,其作用是构造出相应的yylex()函数,返回下一个输入流的单词类型,同时yyparse()函数每一次的语法分析,都需要调用相应的yylex()函数。利用Flex工具会生成lex.yy.c文件,该文件中包含了对于词法分析的相应的函数等。
本文转载自:http://www.biyezuopin.vip/onews.asp?id=15780
#include <stdio.h>
#include <unistd.h>
#include "node.h"
int yyparse(struct Node **);
int main(int argc, char **argv) {
int mode = 1;
char ch;
fp = fopen("cifafenxi.txt", "w+"); //打开存词法分析的文件
fprintf(fp,"%s","..........词法分析结果为.............\n");
fprintf(fp,"%s","类型 Token 符号\n");
while ((ch = getopt(argc, argv, "tc")) != -1) {
switch (ch) {
case 't':
mode = 0;
break;
case 'c':
mode = 1;
break;
default:
fprintf(stderr, "unknown option: %c\n", ch);
}
}
// 抽象语法树
struct Node *AST;
if (yyparse(&AST) == 0) {
if (mode) {
genTAC(AST);
} else {
printAST(AST);
}
}
fclose(fp);
return 0;
}