电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

程序编译原理实验情况报告

13页
  • 卖家[上传人]:不***
  • 文档编号:93110690
  • 上传时间:2019-07-16
  • 文档格式:DOC
  • 文档大小:158.54KB
  • / 13 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、实验一 词法分析程序实现一、实验目的与要求通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词符号组成的流的词法分析方法二、实验内容基本实验题目:若某一程序设计语言中的单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序(各类单词的分类码参见表I)。表I 语言中的各类单词符号及其分类码表单词符号类别编码类别码的助记符单词值begin1BEGINend2ENDif3IFthen4THENelse5ELSE标识符6ID字母打头的字母数字串无符号常数7UCON机内二进制表示8LT=9LE=10EQ11NE12GT=13GE:=14IS+15PL-16MI*17MU/18DI输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。输出:把所识别出的每一单词均按形如(CLASS,VALUE)的二元式形式输出,并将结果放到某个文件中。对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;VALUE字段则是

      2、该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,VALUE字段则为“空”。三、实现方法与环境词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应的状态矩阵,该状态矩阵连同控制程序一起便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具。处理过程简述:在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化

      3、和状态数最小化处理,最后添加当进行状态转移时所需执行的语义动作,就可以据此构造词法分析程序了。为了使词法分析程序结构比较清晰,且尽量避免某些枝节问题的纠缠,我们假定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序中的标识符;在源程序的输入文本中,关键字、标识符、无符号常数之间,若未出现关系和算术运算符以及赋值符,则至少须用一个空白字符加以分隔。作了这些限制以后,就可以把关键字和标识符的识别统一进行处理。即每当开始识别一个单词时,若扫视到的第一个字符为字母,则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表要事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。采用上述策略后,针对表I中的部分单词可以参考教材P80的图3-22(见图1)图1 识别表I所列语言中的部分单词的DFA及相关的语义过程图1中所出现的语义变量及语义函数的含义和功能说明如下:函数GETCHAR:每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示

      4、器前推一个字符位置。字符数组TOKEN:用来依次存放一个单词词文中的各个字符。函数CAT:每调用一次,就把当前ch中的字符拼接于TOKEN中所存字符串的右边。函数LOOKUP:每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整型变量c;否则将c置为零。函数RETRACT:每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)。函数OUT:一般仅在进入终态时调用此函数,调用的形式为OUT(c,VAL)。其中,实参c为相应单词的类别码助记符;实参VAL为TOKEN(即词文)或为空串。函数OUT的功能是,在送出一个单词的内部表示之后,返回到调用该词法分析程序的那个程序。总的来说,开发一种新语言时,由于它的单词符号在不停地修改,采用LEX等工具生成的词法分析程序比较易于修改和维护。一旦一种语言确定了,则采用手工编写词法分析程序效率更高。四源程序#include #include #include #include #define ID 6#define INT 7#define LT 8#define LE 9#define EQ 10#defin

      5、e NE 11#define GT 12#define GE 13#define IS 14#define PL 15#define MI 16#define MU 17#define DI 18#define MAX_KEY_NUMBER 20/关键字的数量#define KEY_WORD_END waiting for your expanding /关键字结束标记char *KeyWordTableMAX_KEY_NUMBER=begin,end, if, then, else, KEY_WORD_END;char TOKEN20=;char ch= ;/用于存储带判断的字符int row=1;/row标识错误在第几行#define DIGIT 1#define POINT 2#define OTHER 3#define POWER 4#define PLUS 5#define MINUS 6#define UCON 7 /假设无符号常量的类数是7#define ClassOther 200#define EndState -1int index=0;/保存已读的字符串的索引in

      6、t w,n,p,e,d;int Class; /用于表示类的词int ICON;float FCON;static int CurrentState; /用于目前的当前状态,初始值:0int EXCUTE (int state, int symbol,FILE *fp,char JudgeStr,int row,int index);int GetChar (char ch);int HandleError (char StrJudge,int row);/查保留字表,判断是否为关键字 int lookup (char *token)int n=0;while (strcmp(KeyWordTablen, KEY_WORD_END) /strcmp比较两串是否相同,若相同返回0if (!strcmp(KeyWordTablen, token) /比较token所指向的关键字和保留字表中哪个关键字相符return n+1; /根据单词分类码表I,设置正确的关键字类别码,并返回此类别码的值break;n+;return 6; /单词不是关键字,而是标识符/输出分析结果void out (i

      7、nt i, char* pStr)char Mnemonic5;if(1=i)strcpy(Mnemonic,BEGIN);else if(2=i)strcpy(Mnemonic,END);else if(3=i)strcpy(Mnemonic,IF);else if(4=i)strcpy(Mnemonic,THEN);else if(5=i)strcpy(Mnemonic,ELSE);else if(6=i)strcpy(Mnemonic,ID);else if(7=i)strcpy(Mnemonic,INT);else if(8=i)strcpy(Mnemonic,LT);else if(9=i)strcpy(Mnemonic,LE);else if(10=i)strcpy(Mnemonic,EQ);else if(11=i)strcpy(Mnemonic,NE);else if(12=i)strcpy(Mnemonic,GT);else if(13=i)strcpy(Mnemonic,GE);else if(14=i)strcpy(Mnemonic,IS);else if(15=

      8、i)strcpy(Mnemonic,PL);else if(16=i)strcpy(Mnemonic,MI);else if(17=i)strcpy(Mnemonic,MU);else if(18=i)strcpy(Mnemonic,DI);elsestrcpy(Mnemonic,Unkown Type);printf(%s )对应%sn,Mnemonic,pStr);/报错void report_error (int row)printf(%s Error! In the %d rown,TOKEN,row);/扫描程序void scanner(FILE *fp)/总的判断函数开始就应该判断已读取的字符是否为空字符,不为则不用再读,直接进行判断,否则再读int i, c;fseek(fp,-1,1);/首先回溯一个字符,就是将文件所有的字符都在scanner内部判断,外部while循环不会浪费任何字符ch=fgetc (fp);/scanner中要想判断字符,必须开头先读一个字符while( =ch|n=ch|t=ch)/将文件中的所有空字符浪费在这里if(n=ch)row+;ch=fgetc (fp);if(EOF

      《程序编译原理实验情况报告》由会员不***分享,可在线阅读,更多相关《程序编译原理实验情况报告》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2 2022年小学体育教师学期工作总结
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.