程序设计语言与编译实验报告文档格式.docx

上传人:b****5 文档编号:21481278 上传时间:2023-01-30 格式:DOCX 页数:25 大小:171.37KB
下载 相关 举报
程序设计语言与编译实验报告文档格式.docx_第1页
第1页 / 共25页
程序设计语言与编译实验报告文档格式.docx_第2页
第2页 / 共25页
程序设计语言与编译实验报告文档格式.docx_第3页
第3页 / 共25页
程序设计语言与编译实验报告文档格式.docx_第4页
第4页 / 共25页
程序设计语言与编译实验报告文档格式.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

程序设计语言与编译实验报告文档格式.docx

《程序设计语言与编译实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《程序设计语言与编译实验报告文档格式.docx(25页珍藏版)》请在冰豆网上搜索。

程序设计语言与编译实验报告文档格式.docx

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

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

当前位置:首页 > 自然科学 > 化学

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

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