




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、福建农林大学计算机与信息学院计算机类课程设计报告课程名称:编译原理课程设计题目:语法分析器姓 名:系:计算机专 业:计算机科学与技术年 级:2009计科学 号:指导教师:职 称:副教授20112012学年第一学期福建农林大学计算机与信息学院计算机类课程设计结果评定评语:成绩:指导教师签字:任务下达日期:评定日期:目 录1 正则表达式11.1 正则表达式11.2 确定化(化简)后的状态转换图11.3 分析程序代码11.4 程序运行截图11.5 小结12 ll(1)分析22.1 ll(1)文法22.2 ll(1)预测分析表22.3 分析程序代码22.4 程序运行截图22.5 小结23 算符优先分析
2、33.1 算符优先文法33.2 算符优先关系表33.3 分析程序代码33.4 程序运行截图33.5 小结34 lr分析44.1 lr文法44.2 lr分析表44.3 分析程序代码44.4 程序运行截图44.5 小结4参考文献:41 正则表达式1.1 正则表达式 (a|b)*(aa|bb)(a|b)* (注:该正规式为示例,可更改)1.2 确定化(化简)后的状态转换图 1.3 分析程序代码#include #include #include using namespace std;/定义一个存储状态转换的类class statupublic:map map;int main()/定义4个状态并初
3、始化各个状态间的关系,以及定义一个存储当前状态的变量statusstatu a, b, c, d, *status;a.mapa = &b;a.mapb = &c;b.mapa = &d;b.mapb = &c;c.mapa = &b;c.mapb = &d;d.mapa = &d;d.mapb = &d;while(1)string:size_type size=0;string str;bool flag = true;cout请输入符合(a|b)*(aa|bb)(a|b)* 的正则表达式 str;status = &a;/刚开始指向初始状态const char *ch = str.c_s
4、tr();while(chsize)if(chsize != a & chsize != b)flag = false;break;status = status-mapchsize+;/根据输入字符串调整状态if(status = &d & flag)/若为终结状态则符合此正则表达式cout正确endl;elsecout错误endl;return 0;1.4 程序运行截图1.5 小结通过定义各个状态,并生成各个状态间的关系可以方便地表示状态转换图,使用关联容器则可以方便的管理状态。2 ll(1)分析2.1 ll(1)文法 ete (注:该文法为示例,可更改) e+te| tft t*ft|
5、f(e)|i2.2 ll(1)预测分析表i+*()#eeteeteee+teeettfttftttt*ftttffif(e)2.3 分析程序代码#include #include #include #include using namespace std;enum symbols/ 终结符号 terminal symbols:tsts_i, / its_plus, / +ts_multiply,/ *ts_l_parens, / (ts_r_parens, / )ts_eos, / #, 0ts_invalid, / 非法字符/非终结符号 none terminal symbols:ntsnt
6、s_e, /ents_ee,/ents_t,/tnts_tt,/tnts_f/f;enum symbols lexer(char c)switch(c)case i:return ts_i;case +:return ts_plus;case *:return ts_multiply;case (:return ts_l_parens;case ):return ts_r_parens;case #:return ts_eos; / 栈底:#终结符号default:return ts_invalid;int main()while(1)cout 输入一个以#结束的字符串 str;p = str
7、.c_str(); map enum symbols, map table; stack ss;/设置词法分析表tablents_ets_i = 1;tablents_ets_l_parens = 1;tablents_eets_plus = 2;tablents_eets_r_parens = 3;tablents_eets_eos = 3;tablents_tts_i = 4;tablents_tts_l_parens = 4;tablents_ttts_plus = 6;tablents_ttts_multiply = 5;tablents_ttts_r_parens = 6;table
8、nts_ttts_eos = 6;tablents_fts_i = 8;tablents_fts_l_parens = 7;/初始化符号栈ss.push(ts_eos);ss.push(nts_e);while(ss.size() 0)if(lexer(*p) = ss.top()p+;ss.pop();elseswitch(tabless.top()lexer(*p)case 1:/1.etess.pop();ss.push(nts_ee);ss.push(nts_t);break;case 2:/2.e+tess.pop();ss.push(nts_ee);ss.push(nts_t);s
9、s.push(ts_plus);break;case 3:/2.ess.pop();break;case 4:/4.tftss.pop();ss.push(nts_tt);ss.push(nts_f);break;case 5:/5.t*ftss.pop();ss.push(nts_tt);ss.push(nts_f);ss.push(ts_multiply);break;case 6:/6.tss.pop();break;case 7:/7.f(e)ss.pop();ss.push(ts_r_parens);ss.push(nts_e);ss.push(ts_l_parens);break;
10、case 8:/7.fiss.pop();ss.push(ts_i);break;default:cout 错误的句子 endl;goto end;break;cout 正确的句子 endl;end:;return 0;2.4 程序运行截图2.5 小结在程序中要跳出多层语句只能用goto语句实现。用枚举类型表示各个终结符与非终结符,再用关联容器生成预测分析表即可方便地实现此算法。3 算符优先分析3.1 算符优先文法 et | e+t | e-t (注:该文法为示例,可更改) tf | t*f | t/f f(e) | i3.2 算符优先关系表+-*/()i#+-*/()i#3.3 分析程序代码
11、#include #include #include #include using namespace std;enum symbols / 终结符号ts_plus,/ +ts_minus,/ -ts_multiply, / *ts_division,/ /ts_l_parens,/ (ts_r_parens, / )ts_i,/ its_eos,/ #, 0ts_invalid,/ 非法字符;map enum symbols, map table; enum symbols lexer(char c)switch(c)case +:return ts_plus;case -:return t
12、s_minus;case *:return ts_multiply;case /:return ts_division;case (:return ts_l_parens;case ):return ts_r_parens;case i:return ts_i;case #:return ts_eos; / 栈底:#终结符号default:return ts_invalid;/初始化算符优先关系表,0、1、2分别表示=、,-1表示不存在void setup()tablets_plusts_plus = 2;tablets_plusts_minus = 2;tablets_plusts_mult
13、iply = 1;tablets_plusts_division = 1;tablets_plusts_l_parens = 1;tablets_plusts_r_parens = 2;tablets_plusts_i = 1;tablets_plusts_eos = 2;tablets_minusts_plus = 2;tablets_minusts_minus = 2;tablets_minusts_multiply = 1;tablets_minusts_division = 1;tablets_minusts_l_parens = 1;tablets_minusts_r_parens
14、= 2;tablets_minusts_i = 1;tablets_minusts_eos = 2;tablets_multiplyts_plus = 2;tablets_multiplyts_minus = 2;tablets_multiplyts_multiply = 2;tablets_multiplyts_division = 2;tablets_multiplyts_l_parens = 1;tablets_multiplyts_r_parens = 2;tablets_multiplyts_i = 1;tablets_multiplyts_eos = 2;tablets_divis
15、ionts_plus = 2;tablets_divisionts_minus = 2;tablets_divisionts_multiply = 2;tablets_divisionts_division = 2;tablets_divisionts_l_parens = 1;tablets_divisionts_r_parens = 2;tablets_divisionts_i = 1;tablets_divisionts_eos = 2;tablets_l_parensts_plus = 1;tablets_l_parensts_minus = 1;tablets_l_parensts_
16、multiply = 1;tablets_l_parensts_division = 1;tablets_l_parensts_l_parens = 1;tablets_l_parensts_r_parens = 0;tablets_l_parensts_i = 1;tablets_l_parensts_eos = -1;tablets_r_parensts_plus = 2;tablets_r_parensts_minus = 2;tablets_r_parensts_multiply = 2;tablets_r_parensts_division = 2;tablets_r_parenst
17、s_l_parens = -1;tablets_r_parensts_r_parens = 2;tablets_r_parensts_i = -1;tablets_r_parensts_eos = 2;tablets_its_plus = 2;tablets_its_minus = 2;tablets_its_multiply = 2;tablets_its_division = 2;tablets_its_l_parens = -1;tablets_its_r_parens = 2;tablets_its_i = -1;tablets_its_eos = 2;tablets_eosts_pl
18、us = 1;tablets_eosts_minus = 1;tablets_eosts_multiply = 1;tablets_eosts_division = 1;tablets_eosts_l_parens = 1;tablets_eosts_r_parens = -1;tablets_eosts_i = 1;tablets_eosts_eos = 0;int main()setup();/初始化优先关系表while(1)cout 输入一个以#结束的符号串 str;p = str.c_str();stack ss;ss.push(ts_eos);while(1)if(lexer(*p)
19、 = ts_invalid)/读取到不在集合中的非法字符cout 不是给定算符优先文法的句子 endl;break;if(ss.top() = ts_eos & lexer(*p) = ts_eos)/成功规约cout 是给定算符优先文法的句子 endl;break;elseif(tabless.top()lexer(*p) = 1 | tabless.top()lexer(*p) = 0)/继续读入字符,暂不规约ss.push(lexer(*p);+p;else if(tabless.top()lexer(*p) = 2) /符合规约要求,开始规约enum symbols temp;whil
20、e(1)temp = ss.top();ss.pop();if(tabless.top()temp = 1)break;else/语法错误cout 不是给定算符优先文法的句子 endl;break;return 0;3.4 程序运行截图3.5 小结此方法初始化优先关系法显得有点繁琐,有待改进。4 lr分析4.1 lr文法 (0) ss (注:该文法为示例,可更改) (1) sbb (2) bab (3) bb4.2 lr分析表actiongotoab#sb0s3s4121acc2s3s453s3s464r3r3r35r1r1r16r2r2r24.3 分析程序代码#include #includ
21、e #include #include using namespace std;enum symbols / 终结符号ts_a,/ ats_b,/ bts_eos,/ #, 0ts_invalid,/ 非法字符/非终结符号nts_ss,/snts_s,/snts_b,/b/状态statuss_0,s_1,s_2,s_3,s_4,s_5,s_6,s_acc,/gogog_s,g_b,/规约式r_1,r_2,r_3,;enum symbols lexer(char c)switch(c)case a:return ts_a;case b:return ts_b;case #:return ts_e
22、os; / 栈底:#终结符号default:return ts_invalid;map enum symbols, map table; int main()while(1)cout 输入一个以#结束的字符串 str;p = str.c_str();stack status;/设置lr分析表tables_0ts_a = s_3;tables_0ts_b = s_4;tables_0nts_s = s_1;tables_0nts_b = s_2;tables_1ts_eos = s_acc;tables_2ts_a = s_3;tables_2ts_b = s_4;tables_2nts_b = s_5;tables_3ts_a = s_3;tables_3ts_b = s_4;tables_3nts_b = s_6;tables_4ts_a = r_3;tables_4ts_b = r_3;tables_4ts_eos = r_3;tables_5ts_a = r_1;tables_5ts_b = r_1;tables_5ts_eos
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 资金入股合同协议书
- 维修合同解除协议书
- 高效利用2025年入团考试试题及答案
- 经验交流2025年中级会计试题及答案
- 2025生物质燃料供需合同
- 2025园林景观设计施工合同
- 税务风险管理与审计实践试题及答案
- 轻松通过2025年入团考试的试题及答案
- 简单易懂中级审计师考试试题及答案
- 2025年家用电器租赁合同
- DB23T 3104-2022 油田含油污泥处置与利用污染控制要求
- 2030冷轧车间设计
- 中华人民共和国飞行基本规则
- 大型污泥脱水离心机机组安装及调试工法
- 塔式起重机大臂减臂使用的受力分析和计算
- 三年高考高考生物试题分项版解析 专题01 组成细胞的分子
- 电力供应与使用条例考试卷及答案
- 生物大分子晶体学基础(I)2016
- 申请增值电信业务经营许可证材料范本说明书
- 关于电商平台对入驻经营者的审核要求或规范文件
- 日用百货购销合同(完整版)
评论
0/150
提交评论