程序设计语言与编译实验报告文档格式.docx
《程序设计语言与编译实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《程序设计语言与编译实验报告文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
20
while
4
<
21
do
5
22
end
6
23
letter(letter|digit)*
10
24
digitdigit*
11
25
*
13
;
26
/
14
(
27
+
15
)
28
-
16
#
c)词法分析程序的功能
输入:
所给文法的源程序字符串。
输出:
二元组(syn,token或sum)构成的序列。
其中:
syn为单词种别码;
token为存放的单词自身字符串;
sum为整型常数。
三、源程序代码:
#include<
stdio.h>
string.h>
iostream.h>
charprog[80],token[8];
charch;
intsyn,p,m=0,n,row,sum=0;
char*rwtab[6]={"
begin"
"
if"
then"
while"
do"
end"
};
voidscaner()
{
for(n=0;
n<
8;
n++)token[n]=NULL;
ch=prog[p++];
while(ch=='
'
{
ch=prog[p];
p++;
}
if((ch>
='
a'
&
ch<
z'
)||(ch>
A'
Z'
))
m=0;
while((ch>
0'
9'
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='
\0'
p--;
syn=10;
for(n=0;
6;
n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
elseif((ch>
sum=0;
while((ch>
sum=sum*10+ch-'
ch=prog[p++];
syn=11;
if(sum>
32767)
syn=-1;
elseswitch(ch)
case'
'
m=0;
token[m++]=ch;
if(ch=='
syn=21;
token[m++]=ch;
elseif(ch=='
syn=22;
else
syn=23;
break;
syn=24;
syn=20;
syn=18;
syn=17;
*'
syn=13;
token[0]=ch;
break;
/'
syn=14;
+'
syn=15;
-'
syn=16;
syn=25;
syn=26;
('
syn=27;
)'
syn=28;
#'
syn=0;
\n'
syn=-2;
default:
syn=-1;
}
voidmain()
p=0;
row=1;
cout<
"
Pleaseinputstring:
endl;
do
cin.get(ch);
prog[p++]=ch;
while(ch!
);
scaner();
switch(syn)
case11:
("
syn<
sum<
)"
case-1:
Errorinrow"
row<
!
case-2:
row=row++;
default:
token<
while(syn!
=0);
四、结果验证
a)给定源程序
beginx:
=9;
ifx>
0thenx:
=2*x+1/3;
end#
输出结果
b)源程序(包括上式未有的while、do以及判断错误语句):
x<
=$;
a<
b<
9-x;
五、实验总结分析
通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;
熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。
另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。
比如:
main()函数中,用cin>
ch;
语句得到ch值的话,给定源程序的结果第一行得到的是(10,beginx),因为得到的字符串中省略了空格,改用cin.get(ch);
问题便解决了。
另外,我在程序中加入了row变量,以便能够准确得到错误所在。
实验二算符优先分析程序
一、实验目的
调试并完成一个算符优先分析程序,加深对算符优先分析原理的理解。
二、实验要求
算符优先分析程序的功能:
所给文法的源程序字符串、待匹配字符串。
转化后的文法、每个非终结符的FIRSTVT集和LASTVT集、算符优先分析表、规约过程。
三、源程序代码:
#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;
//转化后文法规则个数
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();
//创建文法优先关系表
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]!
j++)
if(st[i][0]<
||st[i][0]>
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][0]==c)
break;
if(fflag[i]==0)
n=first[i][0]+1;
do
if(m==2||st[i][m]=='
if(zhongjie(st[i][m+1]))
first[i][n]=st[i][m+1];
n++;
else
if(zhongjie(st[i][m+2]))
{
first[i][n]=st[i][m+2];
n++;
}
if(st[i][m+1]!
=c)
firstvt(st[i][m+1]);
for(j=0;
{
if(st[j][0]==st[i][m+1])
break;
}
for(k=0;
first[j][0];
intt;
for(t=0;
n;
{
if(first[i][t]==first[j][k+1])
break;
}
if(t==n)
first[i][n]=first[j][k+1];
n++;
m++;
}while(st[i][m]!
first[i][n]='
first[i][0]=--n;
fflag[i]=1;
voidlastvt(charc)//求LASTVT集
if(lflag[i]==0)
n=last[i][0]+1;
if(st[i][m+1]=='
||st[i][m+1]=='
if(zhongjie(st[i][m]))
last[i][n]=st[i][m];
if(zhongjie(st[i][m-1]))
last[i][n]=st[i][m-1];
if(st[i][m]!
lastvt(st[i][m]);
if(st[j][0]==st[i][m])
last[j][0];
if(last[i][t]==last[j][k+1])
last[i][n]=last[j][k+1];
last[i][n]='
last[i][0]=--n;
lflag[i]=1;
intdeal()
inti,j;
intx,y;
intz;
//输入串的长度
k=1;
s[k]='
//栈置初值
input[i]!
i++);
//计算输入串的长度
z=i--;
i=0;
while((a=input[i])!
if(zhongjie(s[k]))
j=k;
else
j=k-1;
x=xiabiao(s[j]);
y=xiabiao(a);
if(data[x][y]=='
out(1,k,s);
%c"
a);
out(i+1,z,input);
规约\n"
do
q=s[j];
if(zhongjie(s[j-1