预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共27页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

编译原理实验报告 班级:软件0501班 学号:********** 姓名:*** 词法分析器与语法分析器 I.问题描述 设计、编制并调试一个词法分析子程序,完成识别语言单词的任务; 设计、编制、调试一个语法分析程序,并用它对词法分析程序所提供的单词 序列进行语法检查和结构分析。 ii.设计简要描述 界面需求: 为了更加形象的模拟过程,此实验使用图形界面。要求从图形界面上输入输 入串,点击词法分析,可以将词法分析后识别的单词符号显示,点击语法分析, 可以将语法分析的堆栈过程显示,并且显示结果(是否是符合文法的句子),清 空则可以将所有置空。 功能分析: 1、由用户输入输入串; 2、用户点击“词法分析”,可以将词法分析后识别的单词符号显示。 3、用户点击语法分析,可以将语法分析的堆栈过程显示,并且显示结果(是 否是符合文法的句子) 4、用户点击清空,则将界面所有组件置为空 思路描述: 一、设计构想: 本实验决定编写一个简易C语言的词法分析器和语法分析器。使其能够识 别while,if等关键字,可以判断赋值语句、条件语句、循环语句。 二、文法分析 1、需要识别的关键字及其识别码有: 关键字识别码关键字识别码关键字识别码 main0-11;22 int1*12>23 char2/13<24 if3(14>=25 else4)15<=26 for5[16==27 while6]17!=28 ID7{18ERROR-1 NUM8}19 =9,20 +10:21 2、文法 〈程序〉→main()〈语句块〉 〈语句块〉→{〈语句串〉} 〈语句串〉→〈语句〉;〈语句串〉|〈语句〉; 〈语句〉→〈赋值语句〉|〈条件语句〉|〈循环语句〉 〈赋值语句〉→ID=〈表达式〉; 〈条件语句〉→if〈条件〉〈语句块〉 〈循环语句〉→while〈条件〉〈语句块〉 〈条件〉→(〈表达式〉〈关系符〉〈表达式〉) 〈表达式〉→〈表达式〉〈运算符〉〈表达式〉|(〈表达式〉)|ID|NUM 〈运算符〉→+|-|*|/ 〈关系符〉→<|<=|>|>=|=|!> 转化为符号表示: S→main()K|空 K→{C} C→Y;C|空 Y→F|T|X F→ID=B T→ifJK X→whileJK J→(BGB) B→BZB|(B)|ID|NUM Z→+|-|*|/ G→<|<=|>|>=|==|!> 表示含义: S:程序K:语句块C:语句串Y:语句F:赋值语句 T:条件语句X:循环语句J:条件B:表达式I:项Z:运算符 G:关系符 3、LL(1)分析表 (1),求出first集及follow集: FIRST(S)={mian} FIRST(K)={{} FIRST(C)=FIRST(Y)={ID,if,while,空}; FIRST(Y)=FIRST(F)+FIRST(T)+FIRST(X)={ID,if,while}; FIRST(F)={ID}; FIRST(T)={if}; FIRST(X)={while}; FIRST(J)=FIRST(B)={}; FIRST(B)={(,ID,NUM}; FIRST(Z)={+,-,*,/} FIRST(G)={<,<=,>,>=,==,!=}; FOLLOW(S)={#}; FOLLOW(K)={;}; FOLLOW(C)={}}; FOLLOW(Y)={;} FOLLOW(F)={;}; FOLLOW(T)={;}; FOLLOW(X)={;}; FOLLOW(J)={{,;}; FOLLOW(B)={+,-,*,/,),<,<=,>,>=,==,!=,;}; FOLLOW(B’)={+,-,*,/,),<,<=,>,>=,==,!=,;}; FOLLOW(Z)={(,ID,NUM}; FOLLOW(G)={(,ID,NUM}; (2)消除左递归,拆分文法关系并编号 0、S→空 1、S→main()K 2、K→{C} 3、C→Y;C 4、C→空 5、Y→F 6、Y→T 7、Y→X 8、F→ID=B 9、T→ifJK 10、X→whileJK 11、J→(BGB) 12、B→(B)B' 13、B→IDB' 14、B→NUMB' 15、B'→BZBB' 16、B'→空 17、Z→+ 18、Z→- 19、Z→* 20、Z→/ 21、G→< 22、G→<= 23、G→> 24、G→>= 25、G→== 26、G→!= (3)构造LL(1)分析表 (注:在表中用上一步的编号表示所需要的产生式) main空(){};=ifwhileIDnum+-*/<<=>>===!=# S10 K2 C44333 Y675 F8 T9 X1