欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOC文档下载  

    编译原理实验词法分析报告实验报告材料.doc

    • 资源ID:17187       资源大小:79.55KB        全文页数:10页
    • 资源格式: DOC        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    编译原理实验词法分析报告实验报告材料.doc

    一、实验目的(1) 理解词法分析的功能;(2) 理解词法分析的实现方法;二、实验内容PL0的文法如下< >为非终结符。:= 该符号的左部由右部定义,可读作“定义为。| 表示或,为左部可由多个右部定义。 表示花括号内的语法成分可以重复。在不加上下界时可重复0到任意次数,有上下界时可重复次数的限制。 表示方括号内的成分为任选项。( ) 表示圆括号内的成分优先。上述符号为“元符号, 文法用上述符号作为文法符号时需要用引号括起。程序=分程序分程序= 变量说明局部过程说明局部语句变量说明局部=VAR标识符,标识符:INTEGER;无符号整数=数字数字标识符=字母字母|数字过程说明局部=过程首部分程序;过程说明局部;过程首部=PROCEDURE标识符;语句=赋值语句|条件语句|过程调用语句|读语句|写语句|复合语句|空赋值语句=标识符=表达式复合语句=BEGIN语句;语句END条件=表达式关系运算符表达式表达式=项加法运算符项 项=因子乘法运算符因子因子=标识符|无符号整数|'('表达式')'加法运算符=+|-乘法运算符=*关系运算符=<>|=|<|<=|>|>=条件语句=IF条件THEN语句字母=a|b|X|Y|Z数字=0|1|2|8|9实现PL0的词法分析三、实验分析与设计PL0词法分析程序是一个独立的过程,其功能是为语法语义分析提供单词,把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析。其主要方法步骤为从源程序扫描下一个字符,忽略空格、换行、TAB和注释并识别单词,再将不同类别的单词归类输出。四、实验的实现#include <stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>#include<stdbool.h>#definenorw 11 /norw-1个关键字#defineal 20 /最长的关键字的长度#define ID norw#define INT norw+1#define MA norw+2#define ENDF norw+3#define COLON norw+4#define SEMIC norw+5#define ADD norw+6#define MINUS norw+7#define MULTI norw+8#define EVALU norw+9#define LE norw+10#define NE norw+11#define LT norw+12#define EQ norw+13#define GE norw+14#define GT norw+15#define FLOAT norw+16char TOKEN20; /字符数组用来依次存放单词词文的各个字符extern int lookup(char *); /以TOKEN字符串查保存字表extern void report_error(char); /报告程序中的词法错误bool isalpha(char); /判断接收字符是否为字母bool isalnum(char); /判断接收字符是否为字母或者数字bool isdigit(char); /判断接收字符是否为数字bool isannotation(char); /判断接收字符是否为注释extern char letter(char c); /用来将大写字母转化成小写字母FILE* fin;FILE* fout;void scanner()/词法分析的主体程序,对输入的文本文件进展词法分析char ch;int i,c;int error=0; /记录文件中词法错误的个数ch=fgetc(fin); /从输入文件中读取一个字符while(ch!=EOF)/当从输入文件接收的字符不是文件完毕符时,执行循环if(isalpha(ch)/如果从输入文件接收的第一个字符是字母 ch=letter(ch);TOKEN0=ch;ch=fgetc(fin);i=1;while(isalnum(ch) ch=letter(ch);TOKENi=ch;i+;ch=fgetc(fin);TOKENi='0'c=lookup(TOKEN); /查保存字表if(c=0) fprintf(fout,"(%d,%s)n", ID,TOKEN); /输出标识符else fprintf(fout,"(%d,%s)n", c,TOKEN); /输出接收单词为保存字if(isdigit(ch) /如果从输入文件接收的第一个字符是数字 int cdot=0; /统计小数点个数TOKEN0=ch;ch=fgetc(fin);i=1;while(isdigit(ch)|ch='.')/从第二个接收字符开始,当是数字或者是小数点时,执行循环if(ch='.') cdot+;TOKENi=ch;i+;ch=fgetc(fin);/重复接收字符,直到接收到非数字if(cdot>=2) error+; TOKENi='0' printf("%s is errorn", TOKEN); break; if(isalpha(ch) /如果第二个字符是字母while(isalpha(ch) /接收完所有的字母,跳出循环TOKENi=ch;i+;ch=fgetc(fin);TOKENi='0'error+;printf("%s is errorn", TOKEN);else if(cdot=0) /当接收的字符为整型单词时fseek(fin,-1,1); TOKENi='0' int a,temp=0,c; for(c=0;c<i;c+) a=TOKENc - '0' if(c!=0) temp=temp*10; temp=temp+a; else temp=a; fprintf(fout,"(%d,%d)n", INT, temp); /输出接收单词为整数else if(cdot=1) fseek(fin,-1,1); TOKENi='0' int a,part1=0,jc,b=0; /b用来确定小数点所在的位置 float c=0.1,part2=0.0; while(TOKENb!='.') b=b+1; for(jc=0;jc<b;jc+) a=TOKENjc - '0' if(jc!=0) part1=part1*10; part1=part1+a; else part1=a; for(jc=b+1;jc<i;jc+) a=TOKENjc-'0' part2=a*c+part2; c=c*0.1; fprintf(fout,"(%d,%f)n", FLOAT, part1+part2); /输出接收单词为小数 else if(cdot=2) fseek(fin,-1,1); else /如果从输入文件接收的第一个字符既不是字母又不是数字switch(ch)/将所接收到的符号字符进展分类,采取一符一类case':':ch=fgetc(fin); if(ch='=') fprintf(fout,"(%d,:=)n", EVALU); /输出接收符号为赋值号 elsech=fgetc(fin);fseek(fin,-1,1); /文件接收字符回推一个字符fprintf(fout,"(%d,':')n", COLON); /输出冒号break;case',':fprintf(fout,"(%d,',')n", MA); break; /输出逗号case'.':fprintf(fout,"(%d,'.')n", ENDF);break; /输出句号case'':fprintf(fout,"(%d,'.')n", SEMIC);break; /输出分号case'+':fprintf(fout,"(%d,'+')n", ADD);break; /输出加号case'-':fprintf(fout,"(%d,'-')n", MINUS);break; /输出减号case'*':fprintf(fout,"(%d,'*')n", MULTI);break; /输出乘号case'<':ch=fgetc(fin);if(ch='=')fprintf(fout,"(%d,'<=')n", LE); /输出小于或等于号else if(ch='>')fprintf(fout,"(%d,'<>')n", NE); /输出不等于号elsefseek(fin,-1,1);fprintf(fout,"(%d,'<')n", LT); /输出小于号break;case'=':fprintf(fout,"(%d,'=')n", EQ);break; /输出等于号case'>':ch=fgetc(fin);if(ch='=')fprintf(fout,"(%d,'>=')n", GE); /输出大于或等于号elsefseek(fin,-1,1);fprintf(fout,"(%d,'>')n", GT); /输出大于号break;case' ':break;case'n':break;case't':break;case'/':ch=fgetc(fin);/检查是否为单行注释if(ch='/')while(ch!='n') ch=fgetc(fin); else fseek(fin,-1,1); printf("/ is errorn"); error+; break; case'': while(1) ch=fgetc(fin); if(ch='') break; if(ch=EOF) fseek(fin,-1,1); printf(" is errorn"); error+; break; break; default:printf("%c is errorn", ch); /接收非上述字符程序报告词法错误error+;break;ch=fgetc(fin); /继续从文件中读取下一个单词,直到文件完毕/while循环完毕printf("共发现%d 个词法错误!",error);return;int lookup(char *token)int j; char wordnorwal;strcpy(&(word10), "begin" );strcpy(&(word20), "end");strcpy(&(word30), "var");strcpy(&(word40), "integer");strcpy(&(word50), "while");strcpy(&(word60), "do");strcpy(&(word70), "if");strcpy(&(word80), "then");strcpy(&(word90), "procedure");strcpy(&(word100), "else");for(j=1;j<=norw-1;j+)if(strcmp(token,wordj)=0) return j; /以TOKEN字符串查保存字表,假如查到返回保存字类别码return 0; /TOKEN不是保存字,返回0bool isalpha(char c) /判断接收字符是否为字母if(c>='a'&&c<='z')|(c>='A'&&c<='Z')return 1; else return 0;bool isalnum(char c)/判断接收字符是否为字母或者数字if(c>='a'&&c<='z')|(c>='A'&&c<='Z')|(c>='0'&&c<='9')return 1; else return 0;bool isdigit(char c)/判断接收字符是否为数字if(c>='0'&&c<='9')return 1; else return 0;char letter(char c) /将大写字母转换成小写字母,即不区分大小写 if(c>='A'&&c<='Z') c=c+32; return c;int main()char filename20;printf("请输入文件名:");scanf("%s",filename);if(fin=fopen(filename,"r")=NULL) /打开要读取的文本文件printf("不能打开文件.n");exit(0);printf("请输入保存分析结果的文件名:");scanf("%s",filename);if(fout=fopen(filename,"w")=NULL)printf("不能打开文件.n");exit(0);scanner(); /调用词法分析程序/getchar();getchar();fclose(fin);fclose(fout);return 0;五、运行的结果

    注意事项

    本文(编译原理实验词法分析报告实验报告材料.doc)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开