编译原理课程设计----C语言编译器的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
$
编译原理课程设计报告
设计题目编译代码生成器设计
、
学生姓名
班级
学号
指导老师
成绩
`
一、课程设计的目的
编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。
二、课程设计的要求
1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。
2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正
确。
3、@
4、写出完整的算法框架。
5、编写完整的编译程序。
三、课程设计的内容
课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。通过课程设计可以达到综合设计编译程序的目的。本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。
四、总体设计方案及详细设计
总体设计方案:
1.总体模块
【
2.
\
详细设计:
界面导入设计
(1)一共三个选项:
①choice 1--------cifafenxi
②choice 2--------yufafenxi
③choice 3--------zhongjiandaima
(2)界面演示
}
图一
图二
\
图三
词法分析程序 %
(1)流程图设计
、
置初值
调用扫描子程序
输出单词二元组 输入串结束
结束
否
是
[
(2)具体功能的具体设计
1、cifafenxi( )
首先设置prog[n]来接收输入的语句,以‘#’来结束;
调用扫描子程序 scaner1( ),每一次得到一个类型码;
用switch判别相应输出;
直到syn1=0为止。
2、扫描子程序scaner1( )-----------------扫描输入的语句
首先设置3个变量:
,
①token1用来存放构成单词符号的字符串;
②sum1用来存放整型单词;
③syn1用来存放单词符号的类型码。
有关scaner1()中关键点解析:
①
while((ch==' ')||(ch=='\n')) ch=prog[p++]; ;忽略空格
②
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
…
{ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) { token[m++]=ch;
ch=prog[p++];
} ;判别标识符③
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{ syn=n+1;
;
break;
} ;标识符是否是关键字④
if((ch>='0')&&(ch<='9'))
{ while((ch>='0')&&(ch<='9'))
{ sum=sum*10+ch-'0';
ch=prog[p++];
} }
/
;判别整数
(3) 词法分析的运行结果
输入
begin x:=1; y:=1+2;end #
输出
语法分析程序
(1) 具体功能的具体设计
!
()---------------分析程序
给出算术表达式文法,进行适当的文法变换
输入——表达式;输出——表达式语法是否正确。
2.子程序的功能描述
"
(3) 语法分析的运行结果
分析成功图
分析失败图
【
中间代码生成程序
(1)总体描述
采用递归下降(自上而下)的语法制导翻译法。
在前两次试验的基础上改进。
词法分析程序语法分析程序语义分析程序编译器。不断完善,不断改进。渐变的过程。
.
种别编码单词值
单词符号
main1
int 2.
float3
double4
char…
5
if 6
else 7
…
8
do
while9
l(l|d)*10;
内部字符串
( +|-|ε ) d*(.dd* | ε)( e ( +|-|ε )
20二进制数值表示
dd*|ε)
=21
+/
22
- 23
* 24
(
25
/
(26
)27'
{28
}29
,#
30
;31
>32
|
33
>=