编译原理实验3算符优先分析Word文档格式.docx
- 文档编号:21416635
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:49
- 大小:23.01KB
编译原理实验3算符优先分析Word文档格式.docx
《编译原理实验3算符优先分析Word文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验3算符优先分析Word文档格式.docx(49页珍藏版)》请在冰豆网上搜索。
{
charLeft;
charRight[rightlength
];
int
num;
};
structVT
boolvt[num_noterminal][num_terminal];
structStack
charP;
chara;
class
CMyDlg
public
:
CMyDlg();
void
InputRule();
CString
showLastVT();
showFirstVT();
shownoTerminal(
charG[]);
showTerminal(charg[]);
showLeftS(
char
S[],
j,
k);
InitAll();
showSentence(CString
sen,
start);
showStack(
n);
Initarry(
arry[],
ProdtoCStr(
prod);
selectProd(
i,
S[]);
preFunctor(CStringsen);
insertFirstVT(
Stack
&
sp,
charP,
chara);
insertLastVT(
StackS[],
int&
ShowPreTable();
createPreTable();
charpretable[
num_terminal][
num_terminal];
bool
like_Q(Productionprod,
charQ);
createLastVT();
likeQ_(Productionprod,
likeQa_(Productionprod);
like_aQ(Productionprod);
like_a(Productionprod);
likea_(Productionprod);
Dignose(charc);
findg(
c);
findG(
createFirstVT();
createTerminal();
createnoTerminal();
buildProduction(
s);
test(
CStrings);
parse();
语法分析
gram;
存放文法;
production[
product_num];
VTFirstVT;
VTLastVT;
locProduct;
//已有产生式个数
charG[num_noterminal];
charg[num_terminal];
i_G;
i_g;
m_sen;
FunctorFirst.cpp
#include"
FunctorFirst.h"
CMyDlg:
CMyDlg()
}
s)
//测试是否是算符优先文法
for(
t=1;
inti=0;
i<
s.GetLength()-1;
i++)
if(s[i]>
64&
s[i]<
91&
s[i+1
]>
64&
]<
91)
t=0;
break;
return
t;
voidCMyDlg:
InputRule()
stringinfile;
stringline;
cout<
<
"
请输入语法文件的路径:
;
cin>
>
infile;
endl;
ifstreaminput(infile.c_str());
if(!
input)
endl<
###打不开文件,请确认输入的路径有效###"
<
!
请再次运行本程序!
"
exit(0);
while(getline(input,line))
if(test(line.c_str())==0)
这不是算符优先文法!
buildProduction(line.c_str());
这是算符优先文法!
input.close();
s)
i=0;
j=0;
k=0;
for
(k=0;
k<
s.GetLength();
k++)
//得到左部
if
(s[k]!
=
'
'
)
production[locProduct].Left=
s[k];
(i=k+1;
(
s[i-1
]==
-'
s[i]==
temp=i;
(i=temp+1;
s.GetLength();
(s[i]!
|'
production[locProduct].Right[j]=
j++;
production[locProduct].num=j;
s[i];
else
locProduct++;
production[locProduct].Left=production[locProduct-1].Left;
createnoTerminal()
//建立非终结符索引
i_G=0;
//最后一个位置的下一个下标
intj=0;
for(int
locProduct;
(j=0;
j<
i_G;
(production[i].Left!
=G[j])
(j>
i_G-1)
G[i_G]=production[i].Left;
i_G++;
createTerminal()
//建立终结符索引
i_g=0;
for(inti=0;
for(intk=0;
production[i].num;
chartemp=production[i].Right[k];
if(Dignose(temp))
for(j=0;
i_g;
if(temp!
=g[j])
if(j>
i_g-1)
g[i_g]=temp;
i_g++;
createFirstVT()
//production
已完成,创建
FirstVT
inti,j;
StackS[100];
intsp=0;
for(i=0;
//初始化FirstVT
j++)
FirstVT.vt[i][j]=
false;
if(likea_(production[i]))
insertFirstVT(S,sp,production[i].Left,production[i].Right[0]);
if(likeQa_(production[i]))
insertFirstVT(S,sp,production[i].Left,production[i].Right[1]);
while(sp>
0)
sp--;
charQ=S[sp].P;
chara=S[sp].a;
if(likeQ_(production[i],Q))
insertFirstVT(S,sp,production[i].Left,a);
createLastVT()//创建Last集
i++)//初始化FirstVT
LastVT.vt[i][j]=false;
if(like_a(production[i]))
insertLastVT(S,sp,production[i].Left,
production[i].Right[production[i].num-1]);
if(like_aQ(production[i]))
production[i].Right[production[i].num-2]);
if(like_Q(production[i],Q))
insertLastVT(S,sp,production[i].Left,a);
c)
//定位c在G中的下标
(i=0;
if(c==G[i])
i;
//定位c在g中的下标
if(c==g[i])
boolCMyDlg:
Dignose(
非终结符false
c)
//判断c
是终结符还是非终结符,终结符
true
,
c>
c<
91)
returnfalse;
true;
likea_(
prod)
(Dignose(
prod.Right[0]))
like_a(
//形如P->
⋯a型产生式
(Dignose(return
prod.Right[true;
prod.num-1]))
like_aQ(
⋯aQ型产生式
if(prod.num<
1)
if(Dignose(prod.Right[
prod.num-2])&
(!
prod.Right[prod.num-
1])))
likeQa_(
if(Dignose(prod.Right[1])&
Dignose(returntrue;
prod.Right[0])))
likeQ_(
prod,charQ)
if(prod.Right[0]==
returntrue;
Q)
like_Q(
if(prod.Right[prod.num-1]==returntrue;
createPreTable()
//创建优先表
//初始化优先表pretableinti,j;
pretable[i][j]='
//表错误
production[j].num-1;
charxi,xi1,xi2;
xi=production[j].Right[i];
xi1=production[j].Right[i+1];
xi2=production[j].Right[i+2];
if(Dignose(xi)&
Dignose(xi1))
pretable[findg(xi)][findg(xi1)]='
='
if(i<
production[j].num-2&
Dignose(xi)&
Dignose(xi2)&
(!
Dignose(xi1)))
pretable[findg(xi)][findg(xi2)]=
intN=findG(xi1);
if(FirstVT.vt[N][k]==
true)
pretable[findg(xi)][k]=
if((!
Dignose(xi))&
intN=findG(xi);
if(LastVT.vt[N][k]==
pretable[k][findg(xi1)]=
ShowPreTable()
显示相关集合和优先表
str=
str
=str
+
终结符"
+showTerminal(g)+"
\r\n"
非终结符"
+shownoTerminal(G)
+"
First
集合:
\r\n"
+showFirstVT();
Lasst
+showLastVT();
|"
;
i,j;
+g[i]
+"
|"
⋯⋯⋯⋯"
+="
j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 优先 分析