编译原理课程设计正则表达式LL1分析算符优先LR分析.docx
- 文档编号:2334473
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:23
- 大小:178.57KB
编译原理课程设计正则表达式LL1分析算符优先LR分析.docx
《编译原理课程设计正则表达式LL1分析算符优先LR分析.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计正则表达式LL1分析算符优先LR分析.docx(23页珍藏版)》请在冰豆网上搜索。
编译原理课程设计正则表达式LL1分析算符优先LR分析
福建农林大学计算机与信息学院
计算机类
课程设计报告
课程名称:
编译原理
课程设计题目:
语法分析器
姓名:
陈润铭
系:
计算机
专业:
计算机科学与技术
年级:
11级计升
学号:
3116013049
指导教师:
李小林
职称:
副教授
2012~2013学年第一学期
福建农林大学计算机与信息学院计算机类
课程设计结果评定
评语:
成绩:
指导教师签字:
任务下达日期:
评定日期:
目录
1正则表达式1
1.1正则表达式1
1.2确定化(化简)后的状态转换图1
1.3分析程序代码1
1.4程序运行截图1
1.5小结1
2LL
(1)分析2
2.1LL
(1)文法2
2.2LL
(1)预测分析表2
2.3分析程序代码2
2.4程序运行截图2
2.5小结2
3算符优先分析3
3.1算符优先文法3
3.2算符优先关系表3
3.3分析程序代码3
3.4程序运行截图3
3.5小结3
4LR分析4
4.1LR文法4
4.2LR分析表4
4.3分析程序代码4
4.4程序运行截图4
4.5小结4
参考文献:
4
1正则表达式
1.1正则表达式
(a|b)*(aa|bb)(a|b)*(注:
该正规式为示例,可更改)
1.2确定化(化简)后的状态转换图
1.3分析程序代码
#include
#include
#include
usingnamespacestd;
//定义一个存储状态转换的类
classStatu
{
public:
map
};
intmain()
{
//定义4个状态并初始化各个状态间的关系,以及定义一个存储当前状态的变量status
StatuA,B,C,D,*status;
A.MAP['a']=&B;
A.MAP['b']=&C;
B.MAP['a']=&D;
B.MAP['b']=&C;
C.MAP['a']=&B;
C.MAP['b']=&D;
D.MAP['a']=&D;
D.MAP['b']=&D;
while
(1)
{
string:
:
size_typesize=0;
stringstr;
boolflag=true;
cout<<"请输入符合(a|b)*(aa|bb)(a|b)*的正则表达式"< cin>>str; status=&A;//刚开始指向初始状态 constchar*ch=str.c_str(); while(ch[size]) { if(ch[size]! ='a'&&ch[size]! ='b') { flag=false; break; } status=status->MAP[ch[size++]];//根据输入字符串调整状态 } if(status==&D&&flag)//若为终结状态则符合此正则表达式 cout<<"√正确"< else cout<<"×错误"< } return0; } 1.4程序运行截图 1.5小结 通过定义各个状态,并生成各个状态间的关系可以方便地表示状态转换图,使用关联容器则可以方便的管理状态。 2LL (1)分析 2.1LL (1)文法 E→TE'(注: 该文法为示例,可更改) E'→+TE'|ε T→FT' T'→*FT'|ε F→(E)|i 2.2LL (1)预测分析表 i + * ( ) # E E→TE' E→TE' E' E'→+TE' E'→ε E'→ε T T→FT' T→FT' T' T'→ε T'→*FT' T'→ε T'→ε F F→i F→(E) 2.3分析程序代码 #include #include #include #include usingnamespacestd; enumSymbols { //终结符号Terminalsymbols: TS TS_I,//i TS_PLUS,//+ TS_MULTIPLY,//* TS_L_PARENS,//( TS_R_PARENS,//) TS_EOS,//#,'\0' TS_INVALID,//非法字符 //非终结符号Noneterminalsymbols: NTS NTS_E,//E NTS_EE,//E' NTS_T,//T NTS_TT,//T' NTS_F//F }; enumSymbolslexer(charc) { switch(c) { case'i': returnTS_I; case'+': returnTS_PLUS; case'*': returnTS_MULTIPLY; case'(': returnTS_L_PARENS; case')': returnTS_R_PARENS; case'#': returnTS_EOS;//栈底: #终结符号 default: returnTS_INVALID; } } intmain() { while (1) { cout<<"输入一个以#结束的字符串"< constchar*p; stringstr; cin>>str; p=str.c_str(); map stack //设置词法分析表 table[NTS_E][TS_I]=1; table[NTS_E][TS_L_PARENS]=1; table[NTS_EE][TS_PLUS]=2; table[NTS_EE][TS_R_PARENS]=3; table[NTS_EE][TS_EOS]=3; table[NTS_T][TS_I]=4; table[NTS_T][TS_L_PARENS]=4; table[NTS_TT][TS_PLUS]=6; table[NTS_TT][TS_MULTIPLY]=5; table[NTS_TT][TS_R_PARENS]=6; table[NTS_TT][TS_EOS]=6; table[NTS_F][TS_I]=8; table[NTS_F][TS_L_PARENS]=7; //初始化符号栈 ss.push(TS_EOS); ss.push(NTS_E); while(ss.size()>0) { if(lexer(*p)==ss.top()) { p++; ss.pop(); } else { switch(table[ss.top()][lexer(*p)]) { case1: //1.E→TE' ss.pop(); ss.push(NTS_EE); ss.push(NTS_T); break; case2: //2.E'→+TE' ss.pop(); ss.push(NTS_EE); ss.push(NTS_T); ss.push(TS_PLUS); break; case3: //2.E'→ε ss.pop(); break; case4: //4.T→FT' ss.pop(); ss.push(NTS_TT); ss.push(NTS_F); break; case5: //5.T'→*FT' ss.pop(); ss.push(NTS_TT); ss.push(NTS_F); ss.push(TS_MULTIPLY); break; case6: //6.T'→ε ss.pop(); break; case7: //7.F→(E) ss.pop(); ss.push(TS_R_PARENS); ss.push(NTS_E); ss.push(TS_L_PARENS); break; case8: //7.F→i ss.pop(); ss.push(TS_I); break; default: cout<<"错误的句子"< gotoEND; break; } } } cout<<"正确的句子"< END: ; } return0; } 2.4程序运行截图 2.5小结 在程序中要跳出多层语句只能用goto语句实现。 用枚举类型表示各个终结符与非终结符,再用关联容器生成预测分析表即可方便地实现此算法。 3算符优先分析 3.1算符优先文法 E→T|E+T|E-T(注: 该文法为示例,可更改) T→F|T*F|T/F F→(E)|i 3.2算符优先关系表 + - * / ( ) i # + > > < < < > < > - > > < < < > < > * > > > > < > < > / > > > > < > < > ( < < < < < = < ) > > > > > > i > > > > > > # < < < < < < = 3.3分析程序代码 #include #include #include #include usingnamespacestd; enumSymbols{ //终结符号 TS_PLUS,//+ TS_MINUS,//-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 正则 表达式 LL1 分析 优先 LR