编译原理课程设计
Course Design of Compiling
(课程代码
3273526
)
半期题目: 词法和语法分析器 实验学期: 大三第二学期 学生班级: 2014级软件四班 学生学号: 18 学生姓名: 何华均
任课教师:丁光耀 信息科学与技术学院
课程设计1-C语言词法分析器
1.题目
C语言词法分析
2.内容
选一个能正常运行的c语言程序,以该程序出现的字符作为单词符号集,不用处理c语言的所有单词符号。
将解析到的单词符号对应的二元组输出到文件中保存
可以将扫描缓冲区与输入缓冲区合成一个缓冲区,一次性输入源程序后就可以进行预处理了 3.设计目的
掌握词法分析算法,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解
4.设计环境(电脑语言环境) 语言环境:C语言 CPU:i7HQ6700 内存:8G
5.概要设计(单词符号表,状态转换图) 词法分析器的结构 词法分析程序的功能:
输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。
词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词.
为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:
1) ch 存放最新读进的源程序字符 2) strToken 存放构成单词符号的字符串
3) Buffer 字符缓冲区
4)struct keyType 存放保留字的符号和种别
调用 源程序 输入缓冲区
词法分析子程序 预处理子程序 数据 返回一个单词 扫描缓冲区1 扫描缓冲区2 待分析的简单词法 (1)保留字
break、case、char、const、int、do、while…
(2)运算符和界符
= 、+、 -、 * 、/、%、,、;、(、)、、#
各种单词符号对应的种别码
单词符号 ID INT auto break case char const continue default do double 种别码 0 1 2 3 4 5 6 7 8 9 10 单词符号 sizeof static struct switch typedef union unsigned void volatile while = 种别码 24 25 26 27 28 29 30 31 32 33 34 else enum extern float for goto if int long register return short signed 11 12 13 14 15 16 17 18 19 20 21 22 23 + - * / % , ; ( ) clear # 35 36 37 38 39 40 41 42 43 44 45 46 lettet(letter|digit)47 * dight dight* 48
状态转换图
6.详细设计(数据结构,子程序) 算法思想:
首先设置3个变量:①strToken用来存放构成单词符号的字符串;②ch用来字符;③struct keyType用来存放单词符号的种别码。扫描子程序主要部分流程如下图所示。
子程序结构: 子程序名 GETCHAR() GETBC() CONCAT() LETTER() 功能 读一个字符到 ch 中 读一个非空白字符到ch 中 把CHAR 中字符连接到strToken 之后 判断CHAR 中字符是否为字母 DIGIT() RESERVE() 判断ch 中字符是否为数字 用strToken中的字符串查找保留字表,并返回保留字种别码,若返 回零,则非保留字 RETRACT() 把CHAR 中字符回送到缓冲区
7.程序清单
eyname) == 0) }
void Retract() alue;
}
else if (ch >= '0'&&ch <= '9') { } else {
ConCat(); strcpy, strToken); ConCat(); GetChar(); while (Digit()) { } Retract(); strcpy, strToken); = 1;
ConCat(); GetChar();
return Key[i].value;
return 0;
} /*
}
= Reserve();
return tempkey;
主函数 */ int main() {
行结果
E:/作业/编译原理/
运行结果
九、 实验体会
通过本次次法分析设计实验,我加深了对词法分析过程的理解。并在实际的设计过程深入的了解了编译原理思想。对编译原理课程有了更深的理解
课程设计二:设计简单的语法分析器
一、 题目
设计简单的语法分析器
二、 设计内容
用算符优先分析方法设计一个分析解释程序,对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。
三、 设计目的
了解掌握算符优先分析的基本方法、内容;
四、 设计环境
语言环境:C语言 CPU:i7HQ6700 内存:8G
五、 概要设计
设计思路
语法分析的任务: 把单词符号作为基本单位,分析程序是否为合法的程序.
算符优先分析法是自下而上的语法分析方法,即根据文法,对输入字串进行归约,若能正确地归约为文法的初始符号,则表示输入字串是合法的.主要研究对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。 文法表示:
S→v=E|E|clear E→E+T|E-T|T
T→T*F|T/F|F F→ (E)|v|c
单词种别码设计
符号 = + - * / ( ) v 种别码 1 2 3 4 5 6 7 8 9 10 11 12 13 表示内容及操作 优先关系矩阵 单词种别码结构 变量表中的元素结构 归约栈 单词串 输入串转化成单词串 从单词串中取单词 六、 详细设计 变量及函数说c clear # N 明 变量及函数名 int priority[NUM][NUM] struct WordType struct VarWord mainStack wordStack GetwordStack() GetWord() ClearwordStack()、ClearmainStack() CheckvarTable(char a[]) AddvarTable(VarWord a) InitmainStack() AddmainStack(WordType a) Handle() MainHandle() 清空单词串和归约栈 查看变量在变量表中的位置 变量表添加变量 初始化归约栈 归约栈添加 归约处理程序 归约子程序 七、 程序清单
eyname) == 0)
}
void Retract() alue;
}
else if (ch >= '0'&&ch <= '9') { }
ConCat(); GetChar(); while (Digit()) { } Retract(); strcpy, strToken); = 1;
ConCat(); GetChar();
return Key[i].value;
return 0;
}
else { }
return tempkey;
ConCat(); strcpy, strToken); = Reserve();
bool GetwordStack() { }
int i; = 0; keyType temp; while (strlen(buffer)) {
temp = ReturnWord(); }
else if == 0) } else {
for (i = 0; i if (strcmp, wordType[i].word) == 0) arname) == 0) [].value = 9; ord, ; [].value = 10; ord, ; return i; else if (i == M - 1) return -1; /* 添加变量 */ void AddvarTable(VarWord a) { } /* 初始化归约栈 */ void InitmainStack() { } /* 添加归约栈 */ void AddmainStack(WordType a) { } /* 归约 */ bool Handle() [] = a; ++; [0] = wordType[12]; = 1; [] = a; ++; { } alue == 1) { if [ - 3].value == 9) { i = CheckvarTable[ - 3].word); if (i<0) { } else VarWord temp; strcpy, [ - 3].word); strcpy, [ - 1].word); = true; AddvarTable(temp); int i; alue == 10) { } alue == 9) { [ - 1].value = 13; i = CheckvarTable[ - 1].word); if (i<0) { } else strcpy[ - 1].word, [i].value); printf(\变量 %s 未定义!\, [ - 1].word); return false; [ - 1].value = 13; } } strcpy[i].value, [ - 1].word); strcpy[ - 3].word, [ - 1].word); [ - 3].value = 13; else if [ - 3].value == 13) strcpy[ - 3].word, [ - 1].word); = - 2; alue == 3) { } else if [ - 2].value == 5) { } alue == 2 && [ - 1].value == 13 && [ - 2].value == 12) { printf(\表达式的值为 %s\, [ - 1].word); = 0; int a, b; a = atoi[ - 1].word); b = atoi[ - 3].word); a = a*b; itoa(a, [ - 3].word, 10); = - 2; int a, b; a = atoi[ - 1].word); b = atoi[ - 3].word); a = a + b; itoa(a, [ - 3].word, 10); = - 2; } } alue == 12 && [0].value == 12) = - 2; return true; bool MainHandle() { } /* 主函数 */ int main() { int ok = 1; WordType temp; int ii = 0; while if (priority[[ - 1].value][[0].value] != 1) AddmainStack(GetWord()); else { } if MainHandle(); if { } break; ord, [i].value); Handle(); return true; } while (ok) { } printf(\结束\\n\); return 0; printf(\); printf(\输入第 %d 语句串:\,++ii); scanf(\, buffer); printf(\单词串:\); if (!GetwordStack()) return 0; for (int i = 0; i<; i++) printf(\, [i].word, [i].value); printf(\当前归约栈:\); InitmainStack(); MainHandle(); 八、 运行结果 九、 实验体会 通过本次语法分析设计实验,我加深了对语法分析过程的理解。并在实际的设计过程深入的了解了编译原理思想。对编译原理课程有了更深的理解