算符优先分析算法c语言Word文档下载推荐.docx

上传人:b****1 文档编号:14985830 上传时间:2022-10-26 格式:DOCX 页数:18 大小:42.74KB
下载 相关 举报
算符优先分析算法c语言Word文档下载推荐.docx_第1页
第1页 / 共18页
算符优先分析算法c语言Word文档下载推荐.docx_第2页
第2页 / 共18页
算符优先分析算法c语言Word文档下载推荐.docx_第3页
第3页 / 共18页
算符优先分析算法c语言Word文档下载推荐.docx_第4页
第4页 / 共18页
算符优先分析算法c语言Word文档下载推荐.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

算符优先分析算法c语言Word文档下载推荐.docx

《算符优先分析算法c语言Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《算符优先分析算法c语言Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。

算符优先分析算法c语言Word文档下载推荐.docx

40

else

5

<

38

for

6

>

23

while

7

37

letter(letter\digit)*

10

21

digitdigit*

20

;

34

14

26

+

15

27

-

16

等等

2.3算符优先程序的功能

完成一个交互式面向对象的算符优先分析程序,而一个交互式面向对象的算符优先分析程序基本功能是:

(1)输入文法规则

(2)对文法进行转换

(3)生成每个非终结符的FirstVT和LastVT

(4)生成算符优先分析表

(5)再输入文法符号

(6)生成移进规约步骤

三设计源码

算符优先分析器

#include"

stdio.h"

stdlib.h"

iostream.h"

chardata[20][20];

//算符优先关系

chars[100];

//模拟符号栈s

charlable[20];

//文法终极符集

charinput[100];

//文法输入符号串

charstring[20][10];

//用于输入串的分析

intk;

chara;

intj;

charq;

intr;

//文法规则个数

intr1;

intm,n,N;

//转化后文法规则个数

charst[10][30];

//用来存储文法规则

charfirst[10][10];

//文法非终结符FIRSTVT集

charlast[10][10];

//文法非终结符LASTVT集

intfflag[10]={0};

//标志第i个非终结符的FIRSTVT集是否已求出

intlflag[10]={0};

//标志第i个非终结符的LASTVT集是否已求出

intdeal();

//对输入串的分析

intzhongjie(charc);

//判断字符c是否是终极符

intxiabiao(charc);

//求字符c在算符优先关系表中的下标

voidout(intj,intk,char*s);

//打印s栈

voidfirstvt(charc);

//求非终结符c的FIRSTVT集

voidlastvt(charc);

//求非终结符c的LASTVT集

voidtable();

//创建文法优先关系表

voidmain()

{

inti,j,k=0;

printf("

请输入文法规则数:

"

);

scanf("

%d"

&

r);

请输入文法规则:

\n"

for(i=0;

i<

r;

i++)

{

scanf("

%s"

st[i]);

//存储文法规则,初始化FIRSTVT集和LASTVT集*/

first[i][0]=0;

/*first[i][0]和last[i][0]分别表示st[i][0]非终极

符的FIRSTVT集和LASTVT集中元素的个数*/

last[i][0]=0;

}

i++)//判断文法是否合法

for(j=0;

st[i][j]!

='

\0'

j++)

{

if(st[i][0]<

'

A'

||st[i][0]>

Z'

{

printf("

不是算符文法!

exit(-1);

}

if(st[i][j]>

&

st[i][j]<

if(st[i][j+1]>

st[i][j+1]<

{

printf("

}

}

if((st[i][j]<

||st[i][j]>

)&

-'

|'

lable[k++]=st[i][j];

lable[k]='

#'

lable[k+1]='

table();

每个非终结符的FIRSTVT集为:

//输出每个非终结符的FIRSTVT集

printf("

%c:

"

st[i][0]);

j<

first[i][0];

printf("

%c"

first[i][j+1]);

每个非终结符的LASTVT集为:

//输出每个非终结符的LASTVT集

last[i][0];

last[i][j+1]);

算符优先分析表如下:

lable[i]!

i++)

\t%c"

lable[i]);

k+1;

%c\t"

data[i][j]);

请输入文法输入符号串以#结束:

input);

deal();

}

voidtable()

chartext[20][10];

inti,j,k,t,l,x=0,y=0;

intm,n;

x=0;

firstvt(st[i][0]);

lastvt(st[i][0]);

text[x][y]=st[i][0];

y++;

for(j=1;

if(st[i][j]=='

text[x][y]='

x++;

y=0;

text[x][y]=st[i][0];

y++;

text[x][y++]='

else

text[x][y]=st[i][j];

text[x][y]='

x++;

y=0;

r1=x;

转化后的文法为:

x;

i++)//输出转化后的文法规则串

%s\n"

text[i]);

i++)/*求每个终结符的推导结果(去掉"

->

后的转化文法,用于最后的规约)*/

string[i][0]=text[i][0];

for(j=3,l=1;

text[i][j]!

j++,l++)

string[i][l]=text[i][j];

string[i][l]='

 

text[i][j+1]!

if(zhongjie(text[i][j])&

zhongjie(text[i][j+1]))

m=xiabiao(text[i][j]);

n=xiabiao(text[i][j+1]);

data[m][n]='

if(text[i][j+2]!

zhongjie(text[i][j])&

zhongjie(text[i][j+2])&

n=xiabiao(text[i][j+2]);

for(k=0;

k<

k++)

if(st[k][0]==text[i][j+1])

break;

for(t=0;

t<

first[k][0];

t++)

n=xiabiao(first[k][t+1]);

data[m][n]='

if(!

if(st[k][0]==text[i][j])

last[k][0];

m=xiabiao(last[k][t+1]);

m=xiabiao('

for(t=0;

first[0][0];

n=xiabiao(first[0][t+1]);

data[m][n]='

n=xiabiao('

last[0][0];

m=xiabiao(last[0][t+1]);

data[n][n]='

voidfirstvt(charc)//求FIRSTVT集

inti,j,k,m,n;

if(st[i]

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

当前位置:首页 > 经管营销 > 人力资源管理

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

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