算符优先分析算法c语言Word文件下载.docx
《算符优先分析算法c语言Word文件下载.docx》由会员分享,可在线阅读,更多相关《算符优先分析算法c语言Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
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]