编译原理实验报告.docx

上传人:b****3 文档编号:4097487 上传时间:2023-05-06 格式:DOCX 页数:47 大小:164.23KB
下载 相关 举报
编译原理实验报告.docx_第1页
第1页 / 共47页
编译原理实验报告.docx_第2页
第2页 / 共47页
编译原理实验报告.docx_第3页
第3页 / 共47页
编译原理实验报告.docx_第4页
第4页 / 共47页
编译原理实验报告.docx_第5页
第5页 / 共47页
编译原理实验报告.docx_第6页
第6页 / 共47页
编译原理实验报告.docx_第7页
第7页 / 共47页
编译原理实验报告.docx_第8页
第8页 / 共47页
编译原理实验报告.docx_第9页
第9页 / 共47页
编译原理实验报告.docx_第10页
第10页 / 共47页
编译原理实验报告.docx_第11页
第11页 / 共47页
编译原理实验报告.docx_第12页
第12页 / 共47页
编译原理实验报告.docx_第13页
第13页 / 共47页
编译原理实验报告.docx_第14页
第14页 / 共47页
编译原理实验报告.docx_第15页
第15页 / 共47页
编译原理实验报告.docx_第16页
第16页 / 共47页
编译原理实验报告.docx_第17页
第17页 / 共47页
编译原理实验报告.docx_第18页
第18页 / 共47页
编译原理实验报告.docx_第19页
第19页 / 共47页
编译原理实验报告.docx_第20页
第20页 / 共47页
亲,该文档总共47页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

编译原理实验报告.docx

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

编译原理实验报告.docx

编译原理实验报告

 

实验编程报告

 

学生姓名***

学号***

专业班级***

指导教师***

学院***

时间*****年*月

 

第一章程序设计的目的…………………………………(3)

第二章词法分析编程实现

1问题描述…………………………………………………(4)

2字符串类型的定义………………………………………(4)

3概要设计…………………………………………………(6)

4源程序……………………………………………………(6)

第三章语法分析的编程实现

1问题描述…………………………………………………(16)

2语法规则…………………………………………………(16)

3概要设计…………………………………………………(17)

4源程序……………………………………………………(19)

第四章其他一些小程序

1说明………………………………………………………(24)

2算法

算符优先分析…………………………………………(24)

确定的有限自动机……………………………………(25)

中间代码——a建立链可用函数b回填函数……(26)

LL

(1)文法分析法……………………………………(27)

第五章

实验总结……………………………………………………(32)

参考文献……………………………………………………(32)

第一章程序设计目的

设计目的:

1)熟练掌握计算机编译原理包含的几个阶段:

词法分析、语法分析、中间代码生成和代码的优化过程,并能将其用编程语言表示出来;

2)了解并掌握编程语言与算法的设计方法,具备初步的独立分析和设计能力;

3)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

5)进行全面综合的训练,对课堂教学、实验等环节的有益补充。

6)提高解决实际问题和培养软件工作所需的动手能力。

7)深化理解和灵活掌握教学内容

 

第二章词法分析编程实现

1问题描述

设计一段词法分析的程序,实现接收输入的字符串,判断是关键字,运算符,字符串还是常量等字符串类型。

2字符串类型的定义

1)关键字:

void,main,if,then,break,int,Char,float,include,for,while,printf,scanf;

2)运算符:

“+”;”-”;”*”;”/”;”:

=“;”:

”;”<“;”<=“;”>“;”>=“;”<>“;”=“;”(“;”)”;”;”;”#”;

3)其他标记:

如以字母开头的标识符。

4)空格符跳过;

5)程序中那个设计的各种符号的代码:

关键字分别对应1-13

运算符分别对应401-418,501-513。

字符串对应100

常量对应200

结束符#

3概要设计

运行程序,提示用户输入字符串,并以‘@’为结束标志

输入数字1,得到代码为200,并输出原字符,和自动添加的结尾标志#

输入关键字‘int’

输入运算符‘+’

输入字符串其他字符串

词法分析结束

4源程序代码

#include

#include

#include

#include

inti,j,k,flag,number,status;

/*status标志位,用来判断输入的字符串是否为关键字!

*/

charch;

charwords[10]={""};

charprogram[500];

intScan(charprogram[])

{

char*keywords[13]={"void","main","if","then","break","int",

"char","float","include","for","while","printf",

"scanf"

};/*设置关键字的内容*/

number=0;

status=0;

j=0;

ch=program[i++];

/*当遇到空格键的时候跳过*/

/*判断是否为字母,关键字,标识符等*/

if((ch>='a')&&(ch<='z'))

{

while((ch>='a')&&(ch<='z'))

{

words[j++]=ch;

ch=program[i++];

}

i--;

words[j++]='\0';

for(k=0;k<13;k++)

if(strcmp(words,keywords[k])==0)

switch(k)

{

case0:

{

flag=1;

status=1;

break;

}

case1:

{

flag=2;

status=1;

break;

}

case2:

{

flag=3;

status=1;

break;

}

case3:

{

flag=4;

status=1;

break;

}

case4:

{

flag=5;

status=1;

break;

}

case5:

{

flag=6;

status=1;

break;

}

case6:

{

flag=7;

status=1;

break;

}

case7:

{

flag=8;

status=1;

break;

}

case8:

{

flag=9;

status=1;

break;

}

case9:

{

flag=10;

status=1;

break;

}

case10:

{

flag=11;

status=1;

break;

}

case11:

{

flag=12;

status=1;

break;

}

case12:

{

flag=13;

status=1;

break;

}

}

if(status==0)

{

flag=100;

}

}

/*判断是否为数字*/

elseif((ch>='0')&&(ch<='9'))

{

number=0;

while((ch>='0')&&(ch<='9'))

{

number=number*10+(ch-'0');

ch=program[i++];

}

flag=200;

i--;

}

/*判断是否为运算符*/

elseswitch(ch)

{

case'=':

{

if(ch=='=')

words[j++]=ch;

words[j]='\0';

ch=program[i++];

if(ch=='=')

{

words[j++]=ch;

words[j]='\0';

flag=401;

}

else

{

i--;

flag=402;

}

break;

}

case'>':

{

if(ch=='>')

words[j++]=ch;

words[j]='\0';

ch=program[i++];

if(ch=='=')

{

words[j++]=ch;

words[j]='\0';

flag=403;

}

else

{

i--;

flag=404;

}

break;

}

case'<':

{

if(ch=='<')

words[j++]=ch;

words[j]='\0';

ch=program[i++];

if(ch=='=')

{

words[j++]=ch;

words[j]='\0';

flag=405;

}

else

{

i--;

flag=406;

}

break;

}

case'!

':

{

if(ch=='!

')

words[j++]=ch;

words[j]='\0';

ch=program[i++];

if(ch=='=')

{

words[j++]=ch;

words[j]='\0';

flag=407;

}

else

{

i--;

flag=408;

}

break;

}

case'+':

{

if(ch=='+')

words[j++]=ch;

words[j]='\0';

ch=program[i++];

if(ch=='=')

{

words[j++]=ch;

words[j]='\0';

flag=409;

}

elseif(ch=='+')

{

words[j++]=ch;

words[j]='\0';

flag=410;

}

else

{

i--;

flag=411;

}

break;

}

case'-':

{

if(ch=='-')

words[j++]=ch;

words[j]='\0';

ch=program[i++];

if(ch=='=')

{

words[j++]=ch;

words[j]='\0';

flag=412;

}

elseif(ch=='-')

{

words[j++]=ch;

words[j]='\0';

flag=413;

}

else

{

i--;

flag=414;

}

break;

}

case'*':

{

if(ch=='*')

words[j++]=ch;

words[j]='\0';

ch=program[i++];

if(ch=='=')

{

words[j++]=ch;

words[j]='\0';

flag=415;

}

else

{

i--;

flag=416;

}

break;

}

case'/':

{

if(ch=='/')

words[j++]=ch;

words[j]='\0';

ch=program[i++];

if(ch=='=')

{

words[j++]=ch;

words[j]='\0';

flag=417;

}

else

{

i--;

flag=418;

}

break;

}

case';':

{

words[j]=ch;

words[j+1]='\0';

flag=501;

break;

}

case'(':

{

words[j]=ch;

words[j+1]='\0';

flag=502;

break;

}

case')':

{

words[j]=ch;

words[j+1]='\0';

flag=503;

break;

}

case'[':

{

words[j]=ch;

words[j+1]='\0';

flag=504;

break;

}

case']':

{

words[j]=ch;

words[j+1]='\0';

flag=505;

break;

}

case'{':

{

words[j]=ch;

words[j+1]='\0';

flag=506;

break;

}

case'}':

{

words[j]=ch;

words[j+1]='\0';

flag=507;

break;

}

case':

':

{

words[j]=ch;

words[j+1]='\0';

flag=508;

break;

}

case'"':

{

words[j]=ch;

words[j+1]='\0';

flag=509;

break;

}

case'%':

{

if(ch=='%')

words[j++]=ch;

words[j]='\0';

ch=program[i++];

if(ch=='=')

{

words[j++]=ch;

words[j]='\0';

flag=510;

}

else

{

i--;

flag=511;

}

break;

}

case',':

{

words[j]=ch;

words[j+1]='\0';

flag=512;

break;

}

case'#':

{

words[j]=ch;

words[j+1]='\0';

flag=513;

break;

}

case'@':

{

words[j]='#';

flag=0;

break;

}

default:

{

flag=-1;

break;

}

}

returnflag;

}

/*主函数*/

main()

{

i=0;

printf("词法分析:

\n");

printf("请输入字符串(以'@'结束)\n");//以@为字符串结束的标志

do

{

ch=getchar();

program[i++]=ch;

}

while(ch!

='@');

i=0;

do

{

flag=Scan(program);

if(flag==200)

{

printf("(%2d,%4d)\n",flag,number);

}

elseif(flag==-1)

{

printf("(%d)\n",flag);

}

else

{

printf("(%2d,%4s)\n",flag,words);

}

}

while(flag!

=0);

system("pause");

}

 

第三章语法分析的编程实现

1问题描述

设计一段语法分析的程序,实现根据语法规则判断输入的语句是否语法正确,并给出提示。

2简单的语法规则

1)<程序>:

=begin<语句串>end

2)<语句串>:

=<语句>{;<语句>}

3)<语句>:

=<赋值语句>

4)<赋值语句>:

=ID:

=<表达式>

5)<表达式>:

=<项>{+<项>|-<项>}

6)<项>:

=<因子>{*<因子>|/<因子>

7)<因子>:

=ID|NUM|(<表达式>)

输入语句,以“#”结束,如果是文法正确的句子,则输出成功信息,提示“语法正确”,否则输出“语法错误”的信息。

例如:

输入beginx:

=8;a:

=2+xend#

输出语法正确

输入a=8end#

输出语法错误

3概要设计

运行程序,提示输入语句

输入语句x=a#

输入beginx=5#

输入beginx:

=5#

输入beginx:

=5;end#

4源程序

#include"stdio.h"

#include"string.h"

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

char*rwtab[6]={"begin","if","then","while","do","end"};

intsyn,p,m,n,sum;

intkk;

factor();

expression();

yucu();

term();

statement();

lrparser();

scaner();

main()

{

p=kk=0;

printf("语法分析:

\n");

printf("清输入语句,并以'#'结束:

\n");

do

{scanf("%c",&ch);

prog[p++]=ch;

}while(ch!

='#');

p=0;

scaner();

lrparser();

getch();

}

lrparser()

{

if(syn==1)

{

scaner();

yucu();/*调用yucu()函数;*/

if(syn==6)

{scaner();

if((syn==0)&&(kk==0))

printf("语法正确!

\n");

}

else{if(kk!

=1)printf("语法错误,请以'end'结尾!

\n");

kk=1;

}

}

else{printf("语法错误,请以'begin'开始!

\n");

kk=1;

}

return;

}

yucu()

{

statement();/*调用函数statement();*/

while(syn==26)

{

scaner();/*读下一个单词符号*/

if(syn!

=6)

statement();/*调用函数statement();*/

}

return;

}

statement()

{if(syn==10)

{

scaner();

if(syn==18)

{scaner();

expression();/*调用函数statement();*/

}

else{printf("表达错误,赋值为':

='!

\n");

kk=1;

}

}

else{printf("句子类型错误\n");

kk=1;

}

return;

}

expression()

{term();

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

{scaner();

term();/*调用函数term();*/

}

return;

}

term()

{factor();

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

{scaner();

factor();/*调用函数factor();*/

}

return;

}

factor()

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

elseif(syn==27)

{scaner();

expression();/*调用函数statement();*/

if(syn==28)

scaner();

else{printf("语法错误,出现在'('\n");

kk=1;

}

}

else{printf("语法错误!

\n");

kk=1;

}

return;

}

scaner()

{sum=0;

for(m=0;m<8;m++)token[m++]=NULL;

m=0;

ch=prog[p++];

while(ch=='')ch=prog[p++];

if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

{while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

{token[m++]=ch;

ch=prog[p++];

}

p--;

syn=10;

token[m++]='\0';

for(n=0;n<6;n++)

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

{syn=n+1;

break;

}

}

elseif((ch>='0')&&(ch<='9'))

{while((ch>='0')&&(ch<='9'))

{sum=sum*10+ch-'0';

ch=prog[p++];

}

p--;

syn=11;

}

elseswitch(ch)

{case'<':

m=0;

ch=prog[p++];

if(ch=='>')

{syn=21;

}

elseif(ch=='=')

{syn=22;

}

else

{syn=20;

p--;

}

break;

case'>':

m=0;

ch=prog[p++];

if(ch=='=')

{syn=24;

}

else

{syn=23;

p--;

}

break;

case':

':

m=0;

ch=prog[p++];

if(ch=='=')

{syn=18;

}

else

{syn=17;

p--;

}

break;

case'+':

syn=13;break;

case'-':

syn=14;break;

case'*':

syn=15;break;

case'/':

syn=16;break;

case'(':

syn=27;break;

case')':

syn=28;break;

case'=':

syn=25;break;

case';':

syn=26;break;

case'#':

syn=0;break;

default:

syn=-1;break;

}}

第四章其他一些小程序

1说明

这是一些小程序,有的还只是算法,有的还没有经过严格的程序测试,是在课程学习过程中的一些小测试

2具体的算法

算符优先分析算法

#defineSUCCESS1

#defineERROR0

#defineMAXINPUT256

#defineMAXSTACK100

#defineSTARTSYMBOL'S'

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

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2