编 译 原 理 实 验 报 告_第1页
编 译 原 理 实 验 报 告_第2页
编 译 原 理 实 验 报 告_第3页
编 译 原 理 实 验 报 告_第4页
编 译 原 理 实 验 报 告_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理实验报告课程:编译原理系别:计算机系班级:11网络姓名:王佳明学号:110912049教师:刘老师实验小组:第二组实验一熟悉C程序开发环境、进行简单程序的调试实验目的:1、初步了解vc++6.0环境;2、熟悉掌握调试c程序的步骤:实验内容:输入下列程序,练习TurboC程序的编辑、编译、运行。#include<stdio.h>main(){printf(“Programmingisfun.\n”);}2、分析程序,预测其运行结果,并上机检测你的预测。#include<stdio.h>main(){printf(“*\n”);printf(“***\n”);printf(“*****\n”);printf(“*******\n”);}3、下面是一个加法程序,程序运行时等待用户从键盘输入两个整数,然后求出它们的和并输出。观察运行结果(程序输出),上机验证该程序。#include<stdio.h>main(){inta,b,c;printf(“Pleaseinputa,b:”);scanf(“%d,%d”,&a,&b);c=a+b;printf(“%d+%d=%d\n”,a,b,c);}实验二词法分析器一、实验目的:

设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。二、实验要求:1.对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。2.本程序自行规定:(1)关键字"begin","end","if","then","else","while","write","read","do","call","const","char","until","procedure","repeat"(2)运算符:"+","-","*","/","="(3)界符:"{","}","[","]",";",",",".","(",")",":"(4)其他标记如字符串,表示以字母开头的标识符。

(5)空格、回车、换行符跳过。在屏幕上显示如下:

(1,无符号整数)(begin,关键字)(if,关键字)(+,运算符)(;,界符)

(a,普通标识符)三、使用环境:

Windows下的visualc++6.0;四、调试程序:1.举例说明文件位置:f:、、11.txt目标程序如下:

beginx:=9ifx>0thenx:=x+1;whilea:=0dob:=2*x/3;end;2.运行结果:

五、程序源代码:#include<iostream>#include<string>usingnamespacestd;#define

MAX22

charch='';stringkey[15]={"begin","end","if","then","else","while","write","read","do","call","const","char","until","procedure","repeat"};intIskey(stringc){

//关键字判断

inti;

for(i=0;i<MAX;i++){

if(key[i].compare(c)==0)return1;

}

return0;}intIsLetter(charc){

//判断是否为字母

if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))return1;

elsereturn0;}intIsDigit(charc){

//判断是否为数字

if(c>='0'&&c<='9')return1;

elsereturn0;}voidanalyse(FILE*fpin){

stringarr="";

while((ch=fgetc(fpin))!=EOF){

arr="";

if(ch==''||ch=='\t'||ch=='\n'){}

elseif(IsLetter(ch)){

while(IsLetter(ch)||IsDigit(ch)){

if((ch<='Z')&&(ch>='A'))ch=ch+32;

arr=arr+ch;

ch=fgetc(fpin);

}

fseek(fpin,-1L,SEEK_CUR);

if(Iskey(arr)){cout<<arr<<"\t$关键字"<<endl;}

else

cout<<arr<<"\t$普通标识符"<<endl;

}

elseif(IsDigit(ch)){

while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fpin))){

arr=arr+ch;

ch=fgetc(fpin);

}

fseek(fpin,-1L,SEEK_CUR);

cout<<arr<<"\t$无符号实数"<<endl;

}

elseswitch(ch){

case'+':

case'-':

case'*':

case'=':

case'/':cout<<ch<<"\t$运算符"<<endl;break;

case'(':

case')':

case'[':

case']':

case';':

case'.':

case',':

case'{':

case'}':cout<<ch<<"\t$界符"<<endl;break;

case':':{ch=fgetc(fpin);

if(ch=='=')cout<<":="<<"\t$运算符"<<endl;

else{cout<<"="<<"\t$运算符"<<endl;;

fseek(fpin,-1L,SEEK_CUR);}

}break;case'>':{ch=fgetc(fpin);

if(ch=='=')cout<<">="<<"\t$运算符"<<endl;

if(ch=='>')cout<<">>"<<"\t$输入控制符"<<endl;

else{cout<<">"<<"\t$运算符"<<endl;

fseek(fpin,-1L,SEEK_CUR);}

}break;

case'<':{ch=fgetc(fpin);

if(ch=='=')cout<<"<="<<"\t$运算符"<<endl;

elseif(ch=='<')cout<<"<<"<<"\t$输出控制符"<<endl;

elseif(ch=='>')cout<<"<>"<<"\t$运算符"<<endl;

else{cout<<"<"<<"\t$运算符"<<endl;

fseek(fpin,-1L,SEEK_CUR);}

}break;

default:cout<<ch<<"\t$无法识别字符"<<endl;

}

}}voidmain(){

charin_fn[30];

FILE*fpin;

cout<<"请输入源文件名(包括路径和后缀名):";

for(;;){

cin>>in_fn;

if((fpin=fopen(in_fn,"r"))!=NULL)break;

elsecout<<"文件路径错误!请输入源文件名(包括路径和后缀名):";

}

cout<<"\n********************分析如下*********************"<<endl;

analyse(fpin);

fclose(fpin);}六、实验心得:

通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。实验三自拟微小语言的文法实验目的:熟悉并掌握微小语言结构及定义方法;实验环境:Windowsxp微小语言的实例:Begina:=bb–3.14+a;endFrist集如下:非终极符号first集prog{begin}SL{id,read,write}S{id,read,write}S’{id,read,write,λ}E{id,num,(}IL{id}EL{id,num,(}I’{comma,λ}E’{comma,λ}P{id,num,(}P’{+,-,λ}addop{+,-}Fellow集的设计:非终极符号follow集prog{#}SL{end}S{id,read,write,end}S’{end}E{comma,semicolon,)}IL{)}EL{)}I’{)}E’{)}P{comma,semicolon,+,-,)}P’{comma,semicolon,)}addop{id,num,(}predict集(部分):生成式predict集1{begin}2{id,read,write}3{id,read,write}4{end}5{id}6{read}7[write8{id}9{comma}10{)}11{id,num,(}12{comma}实验四语法分析器实验目的:掌握自上而下语法分析方法;实验环境:配置有vc++6.0的windowsxp的计算机实验步骤:#include<iostream>usingnamespacestd;chara[80];//字符串的存入charsym;//单个的判断字符inti=0;//字符串下标voidE();//功能识别函数voidE2();//功能识别函数voidT();//功能识别函数voidT2();//功能识别函数voidF();//功能识别函数voidinput();//输入函数voidadvance();//字符串小标进一函数voidmain(){while(1){input();advance();E();if(sym=='@')cout<<"success"<<endl;elsecout<<"fail"<<endl;i=0;//重新输入时,下标置0}}voidE(){T();E2();}voidE2(){if(sym=='+'){advance();T();E2();}elseif(sym!=')'&&sym!='@'){cout<<"error!"<<endl;exit(0);}}voidT(){F();T2();}voidT2(){if(sym=='*'){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论