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

下载本文档

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

文档简介

1、院 系: 计算机科学学院 专业、年级: 课程名称: 编译原理 组 号: 学号姓名: 学号姓名: 学号姓名: 学号姓名: 指导教师: 李 航 高 年12月 20 日组号: 实验类别:综合型组员学号姓名实验名称实验一:词法分析实验室实验目的或要求实验目的通过编写一个具体的词法分析程序,加深对词法分析原理的理解。掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。依次输出各个单词的内部编码及单词符号自身值。实验原理(算法流程)程序结构void file:getd

2、ata()输出数据。void file:scanner(FILE *f)文件扫描程序void file:mainnn()主程序入口bool file:isletter(char ch)保留字匹配bool file:isnumber(char ch)数字匹配bool isdetail(char ch)数字匹配(void)viewDidLoad用户界面程序UI的主程序(IBAction)viewdata:(id)sender用户界面中的读取待分析的词法储存文件功能按钮(IBAction)cifafenxi:(id)sender用户界面中的词法分析开始按钮功能(void)didReceiveMemo

3、ryWarning控制用户界面程序内存调控函数程序界面(效果图)程序界面(效果图)程序界面(效果图)程序代码/ File.cpp/ cifafenxi/ Created by Lrcray on 13-11-18./ Copyright (c) 2013年 Lrcray. All rights reserved./#include "File.h"#include<stdio.h>#include<stdlib.h>#include<string.h>using namespace std;/变量声明char ch;char dataar

4、ry4040;char demodata1010;string demodatastring10;/bool isletter(char ch);/bool isnumber(char ch);/void scanner(FILE *f);/void mainn(); void file:mainnn() demodata00='1' demodata01='2' demodata10='a' demodata11='b' demodatastring0=demodata0; demodatastring1=demodata1;

5、/文件读取FILE *fp;do fp = fopen("/Users/lrcray/Desktop/cifafenxi/cifafenxi/input.txt","r");while(!fp);scanner(fp); fclose(fp);         (写不完时,可另加附页。)程序代码bool file:isletter(char ch)/保留字匹配if(ch>='A'&&ch<='Z')|(ch

6、>='a'&&ch<='z')return true;elsereturn false;bool file:isnumber(char ch) /数字匹配if(ch>='0'&&ch<='9') return true; else if (ch='.') return true;elsereturn false;bool isdetail(char ch) /数字匹配if (ch='/') return true; else return fa

7、lse;/文件扫描程序void file:scanner(FILE *f)char arr20; char detailarr20; char deletearr20; char biaoshifu40; char biaoshifu_14040;/数组初始至空。在oc中特殊问题 for (int i=0; i<40; i+) for (int ii=0; ii<20; ii+) biaoshifu_1iii=0; dataarryiii=0;       (写不完时,可另加附页。)程序代码int i=0,j=0,q=0,

8、b=0,s=0,ss=0,sss=0; int bs=0,data_1=0,data_2=0; /ij为数组。qb为注释数组。s-sss为标识符数组while(!(ch=EOF) /进入scan ch = fgetc(f); /从文件中读出一个字符 if( ch=' '| ch ='t');/不操作 else if( ch='n'); /(5)分隔符包括: “,”“;”“(”“)”“”“”等; 单词种别码为5。 else if(ch='(') printf("(%dt"%s")n",5,&q

9、uot;("); sprintf(&dataarrydata_1data_2, "(%dt"%c")n",1,'('); data_1+; else if(ch=')') printf("(%dt"%s")n",5,")"); sprintf(&dataarrydata_1data_2, "(%dt"%c")n",1,')'); data_1+; else if(ch='&#

10、39;) printf("(%dt"%s")n",5,""); sprintf(&dataarrydata_1data_2, "(%dt"%c")n",1,''); data_1+; else if(ch='') printf("(%dt"%s")n",5,""); sprintf(&dataarrydata_1data_2, "(%dt"%c")n"

11、;,1,''); data_1+; else if(ch='') printf("(%dt"%s")n",5,""); sprintf(&dataarrydata_1data_2, "(%dt"%c")n",1,''); data_1+; else if(ch='') printf("(%dt"%s")n",5,""); sprintf(&dataarryd

12、ata_1data_2, "(%dt"%c")n",1,''); data_1+; else if(ch='') printf("(%dt"%s")n",5,""); sprintf(&dataarrydata_1data_2, "(%dt"%c")n",1,''); data_1+; else if(ch=',') printf("(%dt"%s")n&

13、quot;,5,","); sprintf(&dataarrydata_1data_2, "(%dt"%c")n",1,','); data_1+; 程序代码 /-注释处理 else if (isdetail(ch) /注释 int ii=0; while (ii<2) /读入/* detailarrb =ch; b+; ch = fgetc(f); ii+; if (detailarrb-2='/')&&(detailarrb-1='*') do dele

14、tearrq =ch; q+; ch = fgetc(f); while (deletearrq-1!='/'); /数组至空 for (int i_de=0; i_de<20; i_de+) deletearri_de=0; for (int i_de=0; i_de<20; i_de+) detailarri_de=0; q=0; b=0; else if(isletter(ch) /字母scan while(isletter(ch)arri =ch;i+;ch = fgetc(f);程序代码fseek(f,-1L,SEEK_CUR);char* temp1 =

15、(char*)malloc(i+1);memcpy(temp1,arr,i);temp1i ='0'i=0; /(1)识别保留字:if、int、for、while、do、return、break、continue等等;单词种别码为1。 if(strcmp(temp1,"if")=0) printf("(%dt"%s")n",1,temp1); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",1,temp1); data_1+; /i

16、nt的识别,以及标识符的初始化识别和储存 else if(strcmp(temp1,"int")=0) printf("(%dt"%s")n",1,temp1); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",1,temp1); data_1+; do /第一次保存int定义的标识符 do ch = fgetc(f); if( ch=' ')ch = fgetc(f);/空格过滤操作 biaoshifus =ch; s+; whi

17、le (ch!=',')&&(ch!='');程序代码if (ch=',') memcpy(&biaoshifu_1sssss, biaoshifu,s-1); printf("(%dt"%s")n",2,&biaoshifu_1sssss); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",2,&biaoshifu_1sssss); data_1+; printf("(

18、%dt"%s")n",5,","); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",5,","); data_1+; / sss+; ss+; s=0; if (ch='') memcpy(&biaoshifu_1sssss, biaoshifu,s-1); printf("(%dt"%s")n",2,&biaoshifu_1sssss); sprintf(&

19、;dataarrydata_1data_2, "(%dt"%s")n",2,&biaoshifu_1sssss); data_1+; printf("(%dt"%s")n",5,""); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",5,""); data_1+; / sss+; ss+; s=0; while (ch!=''); 程序代码else if(strc

20、mp(temp1,"main")=0) printf("(%dt"%s")n",1,temp1); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",1,temp1); data_1+; else if(strcmp(temp1,"else")=0) printf("(%dt"%s")n",1,temp1); sprintf(&dataarrydata_1data_2, "

21、(%dt"%s")n",1,temp1); data_1+; else if(strcmp(temp1,"for")=0) printf("(%dt"%s")n",1,temp1); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",1,temp1); data_1+; else if(strcmp(temp1,"while")=0) printf("(%dt"%s")n

22、",1,temp1); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",1,temp1); data_1+; else if(strcmp(temp1,"return")=0) printf("(%dt"%s")n",1,temp1); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",1,temp1); data_1+; else if(strcmp(

23、temp1,"break")=0) printf("(%dt"%s")n",1,temp1); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",1,temp1); data_1+; else if(strcmp(temp1,"do")=0) printf("(%dt"%s")n",1,temp1); sprintf(&dataarrydata_1data_2, "(%dt

24、"%s")n",1,temp1); data_1+; 程序代码else /退格 fseek(f,-1L,SEEK_CUR); ch=fgetc(f); /从单词中过滤标识符 i=0; while(isletter(ch)|(isnumber(ch) arri =ch; i+; ch = fgetc(f); char* temp11 =(char*)malloc(i+1); memcpy(temp11,arr,i); temp11i ='0' for (int ii=0; ii<=5; ii+) if (strcmp(temp11,biaosh

25、ifu_1ii)=0) printf("(%dt"%s")n",2,biaoshifu_1ii); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",2,biaoshifu_1ii); data_1+; fseek(f,-i,SEEK_CUR); ch=fgetc(f); break; free(temp1); /程序代码 /(3)常数为整数,浮点数,字符,符号串等;单词种别码为3。 else if(isnumber(ch) /数字while(isnumber(ch)

26、/bs为小数点数目标识符 arrj = ch; /数组数组存储j+;ch = fgetc(f); if (ch='.') bs+=1; if (bs=2) / fseek(f,2,SEEK_CUR);/重复 ch=fgetc(f); break; fseek(f,-1L,SEEK_CUR);/重复char* temp1 =(char*)malloc(j+1);memcpy(temp1,arr,j);temp1j ='0'j=0;printf("(%dt"%s")n",3,temp1); sprintf(&dataa

27、rrydata_1data_2, "(%dt"%s")n",3,temp1); data_1+; if (bs=2) printf("(%dt"%s")n",5,"."); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",5,"."); data_1+; bs=0; free(temp1);/程序代码 /(4)运算符包括:+、-、*、/、=、>、<等;可以考虑更复杂情况>

28、=、<=、!= ;单词种别码为4。 else if(ch='=')ch=fgetc(f);if(ch='=') printf("(%dt"%s")n",4,"="); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",4,"="); data_1+; elseprintf("(%dt"%s")n",4,"="); sprintf(&a

29、mp;dataarrydata_1data_2, "(%dt"%s")n",4,"="); data_1+;fseek(f,-1L,SEEK_CUR); else if(ch='>')ch=fgetc(f);if(ch='=') printf("(%dt"%s")n",4,">="); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",4,&quo

30、t;>="); data_1+; elseprintf("(%dt"%s")n",4,">"); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",4,">"); data_1+;fseek(f,-1L,SEEK_CUR);程序代码else if(ch='<')ch=fgetc(f);if(ch='=') printf("(%dt"%s"

31、;)n",4,"<="); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",4,"<="); data_1+; elseprintf("(%dt"%s")n",4,"<"); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",4,"<"); data_1+;fseek(f

32、,-1L,SEEK_CUR);else if(ch='!')ch=fgetc(f);if(ch='=') printf("(%dt"%s")n",4,"!="); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",4,"!="); data_1+; elseprintf("%s"n","CANNOTLOOKUP"); sprintf(&dat

33、aarrydata_1data_2, "%s"n","CANNOTLOOKUP"); data_1+;fseek(f,-1L,SEEK_CUR); else if (ch='+'|'-'|'*'|'/') if(ch='+') printf("(%dt"%s")n",4,"+"); sprintf(&dataarrydata_1data_2, "(%dt"%s")n&q

34、uot;,4,"+"); data_1+; continue;程序代码if(ch='-') printf("(%dt"%s")n",4,"-"); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",4,"-"); data_1+; continue;if(ch='*') printf("(%dt"%s")n",4,"*"

35、); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",4,"*"); data_1+; continue;if(ch='/') printf("(%dt"%s")n",4,"/"); sprintf(&dataarrydata_1data_2, "(%dt"%s")n",4,"/"); data_1+; continue; else printf

36、("%s"n","ERROR"); sprintf(&dataarrydata_1data_2, "%s"n","ERROR"); data_1+; 程序代码void file:getdata() printf("_n"); for (int ii=0; ii<40; ii+) for (int i=0; i<20; i+) if (dataarryiii!=0) printf("%c",dataarryiii); int file:s

37、etdata(int line_1,int line_2) return dataarryline_1line_2;/ HomepaperViewController.m/ cifafenxi/ Created by Lrcray on 13-11-18./ Copyright (c) 2013年 Lrcray. All rights reserved./程序代码#import "HomepaperViewController.h"#import "File.h"interface HomepaperViewController ()property (

38、weak, nonatomic) IBOutlet UILabel *output;property (weak, nonatomic) IBOutlet UITableView *tableview;endimplementation HomepaperViewController- (void)viewDidLoad super viewDidLoad; cppact->file:mainnn(); cppact->file:getdata(); NSError *error; txtdata= NSString stringWithContentsOfFile:"/

39、Users/lrcray/Desktop/cifafenxi/cifafenxi/input.txt" encoding:NSUTF8StringEncoding error:&error; if (error) NSLog("file conduction error"); / NSString *outputstring;/ / / / for (int i=0; i<40; i+) / outputstring =outputstring stringByAppendingFormat:"%", outputstring,s

40、tringi;/ / 程序代码 /NSLog("%",outputstring);/ Do any additional setup after loading the view, typically from a nib.- (IBAction)viewdata:(id)sender self.output.text=txtdata;- (IBAction)cifafenxi:(id)sender char demostring4040; for (int ii=0; ii<40; ii+) for (int i=0; i<40; i+) demostring

41、iii=cppact->file:setdata(ii,i); for (int i=0; i<40; i+) stringi=NSString stringWithCString:demostringi encoding:NSUTF8StringEncoding; self.tableview reloadData; / self.output.text=;- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionIndex return 40;- (UITabl

42、eViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath NSString *cellIdentifier = "MenuItemCell" UITableViewCell *cell = tableView dequeueReusableCellWithIdentifier:cellIdentifier; if (cell = nil) cell = UITableViewCell alloc initWithStyle:UITableView

43、CellStyleSubtitle reuseIdentifier:cellIdentifier; 程序代码 NSUInteger row = indexPath row; cell.textLabel.text =stringrow; return cell;- (void)didReceiveMemoryWarning super didReceiveMemoryWarning; / Dispose of any resources that can be recreated.end实验结果分析及心得体会组员分工成绩评定 教师签名: 2013年12月 日 年12月 20 日组号: 实验类别:综合型组员学号姓名实验名称实验二:语法分析实验室9205实验目的或要求实验目的根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。也可以采用预测分析方法、算符优先分析方法来进行分析。具体参照课本上的说明,以下是递归下降分析法的介绍。实验

温馨提示

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

评论

0/150

提交评论