3.1目的和要求
1、掌握LL(1)语法分析的基本原理和方法。
2、掌握相应数据结构的设计方法。
3.2实验环境
Windows 7 + DEVC++6.0
3.3实验准备
首先将下列算术表达式文法
E-->E+T|T
T-->T*F|F
F-->(E)|i
改写文法为LL(1)文法;构造LL(1)预测分析表。
解:1)该文法为左递归文法,设非终结符A,B;
E=〉TA
A=〉+TA|ε
T=>FB
B=>*FB|ε
F=>(E)|i
2)计算FIRST,FELLOW,SELECT集:
因为A,B,F的的两个产生式的选择集都没有交集,所以,该文法为LL(1)文法。、
3)构造预测分析表
4)给出i+i的预测分析过程。
7 #AT+ +i# +匹配成功,出栈
8 #AT i# FB逆序替换T
9 #ABF i# i替换F
10 #ABi i# i匹配成功,出栈
11 #AB # B出栈
12 #A # A出栈
13 # # acc
3.4实验内容及步骤
1、根据预测分析表编写预测分析程序yuce。
2、编译成功后,提示输入符号串,用回车键查看输出的结果。
3、比较自己分析的结果和屏幕上的输出结果。
3.5实验小结
1、得到的经验。
2、遇到的主要问题。
3、改进方案。
自拟LL1文法G[A]:
E=>aAE
E=>b
A=>bA
A=>ε
1)计算FIRST,FOLLOW,SELECT集。
2)构造预测分析表。
E=>aAE
=>abAcE
=>abcb
3) 给出abcb的预测分析过程。
3)改进代码,其中用e代替ε
using namespace std;
int main(){
string sheet[2][5]={{"aAE","b","","",""}, //预测分析表
{"","bAc","e","","e"}};
vector
vector
vector
string STC;//用于获取用户输入的字符串
int YourChoice;
do{
cout< S=SOS; //每次执行用空的SOS初始化分析栈 S.push_back('#');//将#放到分析栈中 S.push_back('E');//将E放到分析栈中 STC=""; //将STC设置为空 cout<<"请输入您要分析的字符串:"; cin>>STC; STC.resize(STC.size()+1); STC[STC.size()-1]='#';//将输入串最后一位设置为# Stc=SOS; //Stc是将STC+#倒序压入的用户输入栈 for(int x=STC.size()-1;x>=0;--x) Stc.push_back(STC[x]); string YY="EA"; string XX="abce#"; while(!(S[S.size()-1]=='#'&&Stc[Stc.size()-1]=='#')) { int i=0,j=0; ////////////////////查表找到相应规则//////////////////// for(i=0;i<2;++i) if(YY[i]==S[S.size()-1]) break; for(j=0;j<5;++j) if(XX[j]==Stc[Stc.size()-1]) break; if(i>=5||j>=6) //如果查找超出表 { cout<<"出错啦!"< break; } else if(sheet[i][j]=="") { cout<<"出错啦!"< break; }else{ ///////////////分析栈里的压栈与弹栈//////////////////// S.pop_back(); for(int k=sheet[i][j].size()-1;k>=0;--k) S.push_back(sheet[i][j][k]); if(S[S.size()-1]==Stc[Stc.size()-1]) //一般规则 { S.pop_back(); Stc.pop_back(); } else if(S[S.size()-1]=='e') //含空串的规则 { S.pop_back(); if(S[S.size()-1]!='#'&&Stc[Stc.size()-1]!='#'&&S[S.size()-1]==Stc[Stc.size()-1]) { S.pop_back(); Stc.pop_back();}}}} if(S[S.size()-1]=='#'&&Stc[Stc.size()-1]=='#') cout<<"分析成功!"< cout<<"继续分析"; }while(cin>>YourChoice&&YourChoice==0); return 0; }