北邮 编译原理 语法分析Word格式.docx
- 文档编号:22949724
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:16
- 大小:82.98KB
北邮 编译原理 语法分析Word格式.docx
《北邮 编译原理 语法分析Word格式.docx》由会员分享,可在线阅读,更多相关《北邮 编译原理 语法分析Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
cstdlib>
cstring>
string>
stack>
windows.h>
usingnamespacestd;
stringoriginal[9]={//保存原文法
"
E->
E+T"
"
E-T"
T"
T->
T*F"
T/F"
F"
F->
i"
"
(E)"
n"
};
stringG[11]={//拓广文法
"
TA"
"
A->
+TA"
-TA"
e"
FB"
B->
*FB"
/FB"
};
stringFIRST[5]={//first集
E:
(in"
//E
A:
+-e"
//A
T:
//T
B:
*/e"
//B
F:
//F
stringFOLLOW[5]={//follow集
)$"
+-)$"
+-*/)$"
//F
charVN[5]={'
E'
'
A'
T'
B'
F'
};
//存储非终结符
charVT[9]={'
i'
n'
+'
-'
*'
/'
('
)'
$'
//存储终结符
typedefstructBlock
{
charvn;
//非终结符
charvt;
//终结符
strings;
//产生式
}block;
//存储分析预测表每个位置对应的终结符,非终结符,产生式
blocktable[45];
//5*9=45
charis_vt(chara)//是否为非终结符,不是返回'
x'
{
for(inti=0;
i<
5;
i++)
{
if(a==VN[i])
return'
;
}
if(isalpha(a))//是字母
return'
if(isdigit(a))//是数字
for(inti=0+2;
9;
if(a==VT[i])
returna;
}
intfind_table(charX,chara)//查找是否存在符合的产生式
45;
if(table[i].vn==X&
&
table[i].vt==is_vt(a))
if(0!
=table[i].s.size())
returni;
else
return999;
//error项
return999;
voidLL_one(stringtemp)
stack<
char>
ST;
//栈
ST.push('
);
//初始化压入栈
cout<
<
"
栈"
输入"
输出"
endl;
//23,20,5
inti=0,j=1;
//temp指针
charX;
do{
cout<
j;
if(j>
99)
cout<
:
else
if(j>
9)
cout<
//输出
stack<
t_ST;
//栈
chart_char;
inti2=ST.size();
for(inti1=0;
i1<
i2;
i1++)
{
t_char=ST.top();
t_ST.push(t_char);
ST.pop();
}
t_char=t_ST.top();
t_ST.pop();
t_char;
ST.push(t_char);
23-i2;
|"
20-temp.size()+i;
for(inti1=i;
temp.size();
temp.at(i1);
//开始处理
X=ST.top();
if('
==X||'
!
=is_vt(X))//是终结符或S
if(temp.at(i)==X||(is_vt(temp.at(i))==X))
{
ST.pop();
'
temp.at(i)<
被接收"
i++;
}
endl<
无法接受!
return;
else//是非终结符号
intt_table=find_table(X,temp.at(i));
if(999!
=t_table)
//弹出X
intt_i=table[t_table].s.size()-1;
table[t_table].s;
//压栈
if('
e'
=table[t_table].s.at(t_i))//如果不是->
e
while(table[t_table].s.at(t_i)!
='
>
)//压栈
{
ST.push(table[t_table].s.at(t_i));
t_i--;
}
j++;
}while('
=X);
字符串被成功接收!
!
intmain()
1.原文语法为:
=8;
original[i]<
2.拓广文法为:
G[i]<
3.FIRST集与FOLLOW集:
FIRST("
FIRST[i].at(0)<
)={"
for(intj=2;
j<
FIRST[i].size();
j++)
FIRST[i].at(j)<
}"
FOLLOW("
FOLLOW[i].at(0)<
FOLLOW[i].size();
FOLLOW[i].at(j)<
算法4.2预测分析表的构造:
//初始化
intt=0;
for(intj=0;
table[t].s.clear();
table[t].vn=VN[i];
table[t].vt=VT[j];
t++;
//将产生式添加
stringtemp;
chart_a,t_b;
for(inti=0;
11;
i++)//11个产生式
temp.clear();
temp=G[i];
//取产生式
t_a=temp.at(0);
t_b=temp.at(3);
if('
==t_b)//follow集
intj;
for(j=0;
j++)//取follow集字符
if(t_a==FOLLOW[j].at(0))
break;
stringt_follow(FOLLOW[j],2,FOLLOW[j].size()-2);
j++)//遍历整个表
{
if(table[j].vn==t_a)
for(intk=0;
k<
t_follow.size();
k++)
{
if(table[j].vt==t_follow.at(k))
{
table[j].s.clear();
table[j].s=temp;
}
}
}
else//first集
boolisvn=false;
for(intk=0;
if(t_b==VN[k])
isvn=true;
if(isvn)
//取first集
intj;
for(j=0;
if(t_a==FIRST[j].at(0))
stringt_first(FIRST[j],2,FIRST[j].size()-2);
for(intk=0;
if(table[k].vn==t_a)
for(intl=0;
l<
t_first.size();
l++)
if(table[k].vt==t_first.at(l))
{
table[k].s.clear();
table[k].s=temp;
}
else
if(table[k].vt==t_b&
table[k].vn==t_a)
table[k].s.clear();
table[k].s=temp;
//将预测分析表输出
VT[i]<
----------------------------------------------------------------------"
t=0;
VN[i]<
table[t].s;
for(intk=0;
7-table[t].s.size();
//实现算法4.1,构造LL
(1)预测分析程序
实现算法4.1,LL
(1)分析字符串"
请输入待分析字符串:
cin>
temp;
temp.push_back('
LL_one(temp);
system("
pause"
}运行结果:
1.原文文法,拓广文法
2.FIRST集和FOLLOW集
3分析表
4分析字符串
错误范例((a/-b
错误范例(b)*9)-3
正确输入(a*b+(3/5)-2)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮 编译原理 语法分析 编译 原理