- 1、本文档共22页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理
课程设计报告
题目:C语言子集编译器设计
学号:
姓名:
班级:
教师
得分:
日期:
广西大学
计算机科学与电子信息学院
1、设计任务
1.1编译的语言
本编译器编译的语言为C语言子集,具体如下:
算术运算符:+ - * /
关系运算: = = != ===
逻辑运算 || !
赋值运算 =
数字 0 1 2 3 4 5 6 7 8 9
字符 a…..z A…..Z
标示符的命名规则:由字母和下划线组成,打头的只能是字母,区分大小写,不能和关键字重复。
注释:单行注释// 多行注释/* */
数据类型有整型int ,字符型char
符合数据类型有数组 int a[6]
程序由一个主函数组成
主函数 → void main(){复合语句}
复合语句 → 常量说明部分变量定义部分语句序列
常量定义 → int 标示符=整数{,int 标示符=整数} |
char 标示符=字符{,char 标示符=字符} |
变量定义:int a;
int a,b;
int a=3,b;
语句序列 → 语句;语句序列
语句有赋值语句 标示符=表达式
读语句:scanf(“标示符”)
写语句:printf(字符串);
条件语句:if(条件){}else{}
If (条件){}
循环语句: while(条件){}
For(i=1;i=10;i++){}
1.2抽象文法
1.2.1构造LL1要解决的关键问题
本编译器采用LL1文法,设计LL1文法有两个关键点:
消除文法左递归:
左递归文法如:
E-E+E
E-id|num
可使用增加中间非终结符的方法消除左递归,消除后为:
E-T+E
E-T
Tid|num
消除分析表多重定义
上述文法仍不是LL1文法,采用提公因子的方法修改上述文法后可得LL1文法:
E-TE’
E-‘+T|$
Tid|num
1.2.2 C语言子集的LL1文法
[Terminal]:main printf scanf void int char bool id num ch if else while for ; , ( ) { } = == != + - * / || ! ++ -- #(结束符)
[Nonerminal]:S,B,A,C,,X,R,Z,Z’,U,U’,E,E’,H,H’,G,M,D,L,L’,T,T’,F,O,P,Q
[Starter]:S
[Precept]:
文法开始:
S-void main(){A}
声明:
(2) X-YZ;
(3) Y- int
(4) Y-char
(5) Y-bool
Z-UZ’
Z’-,Z|$
U-idU’
U’-=L|$
赋值:
R-id=L;
算术运算:
L-TL’
L’-+L|-L|$
T-FT’
T’-*T|/T|$
F-(L)
F-id|num
O-++|--|$
Q-idO|$
布尔运算
E-HE’
E’-E|$
H-GH’
H’-||H
H’-$
G-FDF
D-||==|!=
G-(E)
G-!E
5、控制语句
B-if (E){A}else{A}
B-while(E){A}
B-for(YZ;G;Q){A}
6、功能函数
B-printf(P);
B-scanf(id);
P-id|ch|num
7、复合语句
A-CA
C-X|B|R
A-$
2、需求分析
为C语言子集设计一个简单编译器,要求有友好的图形界面,能够实现编译的词法分析,语法分析和语义分析功能,并具备一定的错误处理能力,给出总的出错报告,编译最终形成四元式的中间代码形式。
3、系统设计
4、详细设计
4.1构造LL1分析表
1、求个产生式的select集
注意:一定要记得求空产生式A-$的select集
具体过程(略),结果可见LL1分析表
2、最终获得的LL1分析表
main printf scanf void int char bool id
(自定义变量) num(int常量) ch(char
常量) S S
void
main(){A} A A-CA
A-CA
A-CA A-CA A-CA A-CA B B-
printf(P); B-
scanf(id);
文档评论(0)