编译原理实验报告.docx
《编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告.docx(47页珍藏版)》请在冰点文库上搜索。
![编译原理实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/a67c6d1c-62e1-4c2d-bfcc-40c9972e9954/a67c6d1c-62e1-4c2d-bfcc-40c9972e99541.gif)
编译原理实验报告
实验编程报告
学生姓名***
学号***
专业班级***
指导教师***
学院***
时间*****年*月
第一章程序设计的目的…………………………………(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'