编译原理实验报告文档格式.docx

上传人:b****5 文档编号:20614966 上传时间:2023-01-24 格式:DOCX 页数:20 大小:176.96KB
下载 相关 举报
编译原理实验报告文档格式.docx_第1页
第1页 / 共20页
编译原理实验报告文档格式.docx_第2页
第2页 / 共20页
编译原理实验报告文档格式.docx_第3页
第3页 / 共20页
编译原理实验报告文档格式.docx_第4页
第4页 / 共20页
编译原理实验报告文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

编译原理实验报告文档格式.docx

《编译原理实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

编译原理实验报告文档格式.docx

20

wile

4

21

do

5

22

end

6

23

lettet(letter|digit)*

10

24

dightdight*

11

25

+

13

26

14

27

*

15

28

/

16

#

2.3词法分析程序的功能:

输入:

所给文法的源程序字符串。

输出:

二元组(syn,token或sum)构成的序列。

其中:

syn为单词种别码;

token为存放的单词自身字符串;

sum为整型常数。

例如:

对源程序beginx:

=9:

ifx>

9thenx:

=2*x+1/3;

end#的源文件,经过词法分析后输出如下序列:

(1,begin)(10,x)(18,:

=)(11,9)(26,;

)(2,if)……

【算法】

算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

3.1主程序示意图:

主程序示意图如图3-1所示。

其中初始包括以下两个方面:

⑴关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。

如能查到匹配的单词,则该单词为关键字,否则为一般标识符。

关键字表为一个字符串数组,其描述如下:

Char*rwtab[6]={“begin”,“if”,“then”,“while”,“do”,“end”,};

(2)程序中需要用到的主要变量为syn,token和sum

3.2扫描子程序的算法思想:

首先设置3个变量:

①token用来存放构成单词符号的字符串;

②sum用来整型单词;

③syn用来存放单词符号的种别码。

扫描子程序主要部分流程如图3-2所示。

【源程序】

#include<

stdio.h>

string.h>

charprog[80],token[8],ch;

intsyn,p,m,n,sum;

char*rwtab[6]={"

begin"

"

if"

then"

while"

do"

end"

};

scaner();

main()

{p=0;

printf("

\npleaseinputastring(endwith'

#'

):

/n"

);

do{

scanf("

%c"

&

ch);

prog[p++]=ch;

}while(ch!

='

p=0;

switch(syn)

{case11:

printf("

(%-10d%5d)\n"

sum,syn);

break;

case-1:

youhaveinputawrongstring\n"

getch();

exit(0);

default:

(%-10s%5d)\n"

token,syn);

}

}while(syn!

=0);

scaner()

{sum=0;

for(m=0;

m<

8;

m++)token[m++]=NULL;

ch=prog[p++];

m=0;

while((ch=='

'

)||(ch=='

\n'

))ch=prog[p++];

if(((ch<

z'

)&

&

(ch>

a'

))||((ch<

Z'

A'

)))

{while(((ch<

))||((ch>

0'

(ch<

9'

{token[m++]=ch;

p--;

syn=10;

for(n=0;

n<

6;

n++)

if(strcmp(token,rwtab[n])==0)

{syn=n+1;

elseif((ch>

))

{while((ch>

{sum=sum*10+ch-'

;

syn=11;

elseswitch(ch)

{case'

'

:

token[m++]=ch;

if(ch=='

{syn=22;

token[m++]=ch;

else

{syn=20;

case'

{syn=24;

{syn=23;

+'

{syn=17;

{syn=13;

-'

{syn=29;

{syn=14;

!

ch=prog[p++];

{syn=21;

{syn=31;

{syn=25;

{syn=18;

*'

syn=15;

/'

syn=16;

('

syn=27;

)'

syn=28;

{'

syn=5;

}'

syn=6;

syn=26;

\"

syn=30;

syn=0;

syn=17;

syn=-1;

token[m++]='

\0'

【实验结果】

输入beginx:

end#后经词法分析输出如下序列:

(begin1)(x10)(:

17)(=18)(911)(;

26)(if2)……如图5-1所示:

图5-1

【总结】

词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

通过本试验的完成,更加加深了对词法分析原理的理解。

实验二语法分析

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

【程序功能】

利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

2.1待分析的简单语言的语法

用扩充的BNF表示如下:

⑴<

程序>

=begin<

语句串>

⑵<

=<

语句>

{;

}

⑶<

赋值语句>

⑷<

=ID:

表达式>

⑸<

项>

{+<

|-<

2.2程序功能说明

输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。

输入begina:

=9;

x:

=2*3;

b:

=a+xend#

输出success!

输入x:

=a+b*cend#

输出error

2.3语法分析程序的算法思想

(1)主程序示意图如图2-1所示。

(2)递归下降分析程序示意图如图2-2所示。

(3)语句串分析过程示意图如图2-3所示。

(4)statement语句分析程序流程如图2-4、2-5、2-6、2-7所示。

#include"

stdio.h"

string.h"

charprog[100],token[8],ch;

intkk;

factor();

expression();

yucu();

term();

statement();

lrparser();

scaner();

{

p=kk=0;

\npleaseinputastring(endwith'

\n"

{scanf("

p=0;

getch();

lrparser()

if(syn==1)

{

/*读下一个单词符号*/

yucu();

/*调用yucu()函数;

*/

if(syn==6)

{scaner();

if((syn==0)&

(kk==0))

success!

\n"

else{if(kk!

=1)printf("

thestringhaven'

tgota'

end'

kk=1;

else{printf("

haven'

begin'

kk=1;

return;

yucu()

{

/*调用函数statement();

while(syn==26)

{

if(syn!

=6)

}

return;

statement()

{if(syn==10)

if(syn==18)

expression();

else{printf("

thesing'

iswrong!

wrongsentence!

expression()

{term();

while((syn==13)||(syn==14))

term();

/*调用函数term();

term()

{factor();

while((syn==15)||(syn==16))

factor();

/*调用函数factor();

*/

factor()

{if((syn==10)||(syn==11))scaner();

elseif(syn==27)

if(syn==28)

theerroron'

theexpressionerror!

scaner()

sum=0;

while(ch=='

)ch=prog[p++];

if(strcmp(token,rwtab[n])==0)

{sum=sum*10+ch-'

p--;

syn=11;

m=0;

syn=21;

elseif(ch=='

syn=22;

syn=20;

syn=13;

syn=14;

break;

syn=25;

default:

输入begina:

=a+xend#后输出success!

如图4-1所示:

图4-1

输入x:

=a+b*cend#后输出error如图4-2所示:

图4-2

通过本次试验,更加深入的了解了语法分析程序的运行过程。

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

当前位置:首页 > 初中教育 > 学科竞赛

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

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