编译原理实验3算符优先分析Word文件下载.docx

上传人:b****1 文档编号:13287223 上传时间:2022-10-09 格式:DOCX 页数:25 大小:17.08KB
下载 相关 举报
编译原理实验3算符优先分析Word文件下载.docx_第1页
第1页 / 共25页
编译原理实验3算符优先分析Word文件下载.docx_第2页
第2页 / 共25页
编译原理实验3算符优先分析Word文件下载.docx_第3页
第3页 / 共25页
编译原理实验3算符优先分析Word文件下载.docx_第4页
第4页 / 共25页
编译原理实验3算符优先分析Word文件下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

编译原理实验3算符优先分析Word文件下载.docx

《编译原理实验3算符优先分析Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验3算符优先分析Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。

编译原理实验3算符优先分析Word文件下载.docx

string>

usingnamespacestd;

#definerightlength20

#defineproduct_num20//产生式最多个数

#definenum_noterminal26//非终结符最多个数

#definenum_terminal26//终结符最多个数

structProduction

{

charLeft;

charRight[rightlength];

intnum;

};

 

structVT

boolvt[num_noterminal][num_terminal];

structStack

charP;

chara;

classCMyDlg

public:

CMyDlg();

voidInputRule();

CStringshowLastVT();

CStringshowFirstVT();

CStringshownoTerminal(charG[]);

CStringshowTerminal(charg[]);

CStringshowLeftS(charS[],intj,intk);

voidInitAll();

CStringshowSentence(CStringsen,intstart);

CStringshowStack(charS[],intn);

voidInitarry(chararry[],intn);

CStringProdtoCStr(Productionprod);

intselectProd(inti,intj,charS[]);

voidpreFunctor(CStringsen);

voidinsertFirstVT(StackS[],int&

sp,charP,chara);

voidinsertLastVT(StackS[],int&

voidShowPreTable();

voidcreatePreTable();

charpretable[num_terminal][num_terminal];

boollike_Q(Productionprod,charQ);

voidcreateLastVT();

boollikeQ_(Productionprod,charQ);

boollikeQa_(Productionprod);

boollike_aQ(Productionprod);

boollike_a(Productionprod);

boollikea_(Productionprod);

boolDignose(charc);

intfindg(charc);

intfindG(charc);

voidcreateFirstVT();

voidcreateTerminal();

voidcreatenoTerminal();

voidbuildProduction(CStrings);

booltest(CStrings);

voidparse();

//语法分析

CStringgram;

//存放文法;

Productionproduction[product_num];

VTFirstVT;

VTLastVT;

intlocProduct;

//已有产生式个数

charG[num_noterminal];

charg[num_terminal];

inti_G;

inti_g;

CStringm_sen;

FunctorFirst.cpp

#include"

FunctorFirst.h"

CMyDlg:

:

CMyDlg()

}

boolCMyDlg:

test(CStrings)//测试是否是算符优先文法

boolt=1;

for(inti=0;

i<

s.GetLength()-1;

i++)

if(s[i]>

64&

&

s[i]<

91&

s[i+1]>

64&

s[i+1]<

91)

{

t=0;

break;

}

returnt;

voidCMyDlg:

InputRule()

stringinfile;

stringline;

cout<

<

"

请输入语法文件的路径:

"

;

cin>

>

infile;

endl;

ifstreaminput(infile.c_str());

if(!

input)

{

cout<

endl<

###打不开文件,请确认输入的路径有效###"

<

!

请再次运行本程序!

exit(0);

}

while(getline(input,line))

if(test(line.c_str())==0)

cout<

这不是算符优先文法!

exit(0);

buildProduction(line.c_str());

这是算符优先文法!

input.close();

buildProduction(CStrings)

inti=0;

intj=0;

intk=0;

for(k=0;

k<

s.GetLength();

k++)//得到左部

if(s[k]!

='

'

production[locProduct].Left=s[k];

for(i=k+1;

if(s[i-1]=='

-'

s[i]=='

'

inttemp=i;

for(i=temp+1;

if(s[i]!

|'

if(s[i]!

{

production[locProduct].Right[j]=s[i];

j++;

production[locProduct].num=j;

}

else

locProduct++;

production[locProduct].Left=production[locProduct-1].Left;

j=0;

locProduct++;

createnoTerminal()//建立非终结符索引

i_G=0;

//最后一个位置的下一个下标

locProduct;

for(j=0;

j<

i_G;

if(production[i].Left!

=G[j])

else

break;

if(j>

i_G-1)

G[i_G]=production[i].Left;

i_G++;

createTerminal()//建立终结符索引

i_g=0;

for(intk=0;

production[i].num;

k++)

chartemp=production[i].Right[k];

if(Dignose(temp))

for(j=0;

i_g;

{

if(temp!

=g[j])

j++;

else

break;

}

if(j>

i_g-1)

g[i_g]=temp;

i_g++;

createFirstVT()//production已完成,创建FirstVT

inti,j;

StackS[100];

intsp=0;

for(i=0;

i++)//初始化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;

for(i=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1