欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    编译原理实验报告2-词法分析程序的设计(共9页).doc

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

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

    编译原理实验报告2-词法分析程序的设计(共9页).doc

    精选优质文档-倾情为你奉上实验2 词法分析程序的设计一、实验目的掌握计算机语言的词法分析程序的开发方法。 二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求1、根据以下的正规式,编制正规文法,画出状态图;标识符 <字母>(<字母>|<数字字符>)*十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*)八进制整数 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和界符+ - * / > < = ( ) ;关键字if then else while do 2、根据状态图,设计词法分析函数int scan( ),完成以下功能:1) 从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,2) 以二元式形式输出单词<单词种类,单词属性>其中单词种类用整数表示:0:标识符1:十进制整数2:八进制整数3:十六进制整数运算符和界符,关键字采用一字一符,不编码其中单词属性表示如下:标识符,整数由于采用一类一符,属性用单词表示运算符和界符,关键字采用一字一符,属性为空3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境 五、实验步骤1、 根据正规式,画出状态转换图;01字母空白字母或数字非字母与数字3194092非数字5061707非0778x909或af非09与af1011+ 或或* 或/ 或< 或> 或= 或 (或 ) 或 ;12if then  else  while  do*非17与x09或af2、 根据状态图,设计词法分析算法;观察状态图,其中状态2、4、7、10(右上角打了星号)需要回调一个字符。声明一些变量和函数:ch:字符变量,存放最新读进的源程序字符。strToken:字符串变量,存放构成单词符号的字符串。GetChar():子函数,将下一输入字符读到ch中,搜索指示器前移一字符位置。GetBC():子函数,检查ch中的字符是否为空白。若是,则调用GetChar()直至ch中进入一个非空白字符。Concat():子函数,将ch中的字符连接到strToken之后。IsLetter():布尔函数,判断ch中的字符是否为字母。IsDigit():布尔函数,判断ch中的字符是否为数字。Reserve():整型函数,对strToken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回0。SearchOp():整型函数,对ch查找运算符和界符,若它是一个运算符或界符,则返回它的编码,否则返回0。Retract():子函数,将搜索指示器回调一个字符位置,将ch置为空白字符。ProError():错误处理函数。关键字保存在字符数组中,定义编码为相对数组首地址的位置 + 1。保留子表顺序如下: if ,then ,else ,while, do ,则相应编码为:1,2,3,4,5。运算符和界符保存在字符数组中,编码定义与关键字相同,顺序如下: + ,- , * , / , > , < , = , ( , ) , ;,编码为:110。二元表单词单词种类属性标识符0单词自身十进制整数1单词自身八进制整数2单词自身十六进制整数3单词自身运算符和界符单词自身-关键字单词自身-算法如下:ch= ;strToken=” ”;GetBC();if(IsLetter() while(IsLetter() | IsDigit() Concat();GetChar(); Retract();If(Reserve()printf("<%s , ->", strToken); else printf("<,0,%s >", strToken);else if(1 < =ch && ch <=9) while(IsDigit() Concat();GetChar(); Retract();printf("<,1,%s >", strToken) ; else if(ch=0) GetChar();if(ch >= 1 && ch <= 7) while(ch >= 0 && ch <= 7) Concat();GetChar(); Retract();printf("<,2,%s >", strToken) ;else if(ch=x) GetChar();while(IsDigit() | ch>= a && ch<=f) Concat();GetChar(); Retract();printf("<,3,%s >", strToken);else Retract();printf(“<1,0> “) ;else if(SearchOp() printf("<%c,- >", ch);else ProError();3、 采用C或C+语言,设计函数scan( ),实现该算法;char GetChar(FILE* fp) /读取文件中的一个字符char ch;ch = fgetc(fp);return ch;char GetBC(FILE* fp) /读取文件的字符直至ch不是空白char ch;do ch = GetChar(fp); while (ch = ' ' | ch = 't' | ch = 'n');return ch;void Concat(char ch ,char strToken) /将ch中的字符连接到strToken之后char str2;str0 = ch;str1 = '0'strcat(strToken,str);int IsLetter(char ch) /布尔函数,判断ch中的字符是否为字母,是返回1,否则返回0int flag = 0;if (ch >= 'a' && ch <= 'z')flag = 1;return flag;int IsDigit(char ch) /布尔函数,判断ch中的字符是否为数字,是返回1,否则返回0int flag = 0;if (ch >= '0' && ch <= '9')flag = 1;return flag;int Reserve(char strToken) /整型函数,对strToken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回0int code = 0,i;char keyWord66 = "if", "then", "else", "while", "do" ;for (i = 0; i < 5; i+) if (strcmp(strToken, keyWordi) = 0) code = i + 1;break;return code;int SearchOP(char ch) /整型函数,对strToken中的字符串查找运算符和界符,若它是一个运算符或界符,则返回它的编码,否则返回0int code = 0, i;char OP11 = '+', '-', '*', '/', '<', '>', '=', '(', ')', '' ;for (i = 0; i < 10; i+) if (ch = OPi) code = i + 1;break;return code;char Retract(FILE* fp,char ch) /子函数,将搜索指示器回调一个字符位置,将ch置为空白字符ch = ' 'fseek(fp, -1L, 1);return ch;void ProError( ) /错误处理函数printf("输入错误!n");return;FILE* scan(FILE* fp) /输出单个二元式char ch;char strToken10;strToken0 = '0'/置strToken为空串ch = GetBC(fp); /先读取一个非空白的字符if (feof(fp) return fp;/判断文件尾,是则返回调用程序if (IsLetter(ch) /判断标识符while (IsLetter(ch) | IsDigit(ch) Concat(ch, strToken);ch = GetChar(fp);ch = Retract(fp,ch);if (Reserve(strToken) /判断关键字printf("<%s,->n", strToken);elseprintf("<0,%s>n", strToken);else if (ch >= '1' && ch <= '9') /判断十进制整数while (IsDigit(ch) Concat(ch, strToken);ch = GetChar(fp);ch = Retract(fp, ch);printf("<1,%s>n", strToken);else if (ch = '0') ch = GetChar(fp);if (ch >= '1' && ch <= '7') /判断八进制整数while (ch >= '0' && ch <= '7') Concat(ch, strToken);ch = GetChar(fp);ch = Retract(fp, ch);printf("<2,%s>n", strToken);else if (ch = 'x') /判断十六进制整数ch = GetChar(fp);while (IsDigit(ch) | ch >= 'a' && ch <= 'f') Concat(ch, strToken);ch = GetChar(fp);ch = Retract(fp, ch);printf("<3,%s>n", strToken);else /判断十进制的0ch = Retract(fp, ch);printf("<1,0>n");else if (SearchOP(ch) /判断运算符和界符printf("<%c,->n", ch);else /出错ProError();return fp;4、 编制测试程序(主函数main);#include<iostream>using namespace std;#define NULL 0int main( ) FILE* fp; if (fp = fopen("C:UsersAdministratorDesktopCode.txt", "r") = NULL) /以只读方式打开文件,失败则退出程序printf("file can not open!");exit(0);printf("词法分析结果如下:n");while (!feof(fp) /若不是文件尾则执行循环fp = scan(fp);/输出单词种类、属性的二元式fclose(fp); /关闭文件fp = NULL;/避免指向非法内存5、调试程序:读入文本文件,检查输出结果。  六、测试数据 输入数据:<if , -><0 , data><+ , -><1 , 92><> , -><3 , 3f><then , -><0 , data><= , ><0 , data><+ , -><2 , 1>< ,-><else , -><0 , data><= , -><0 , data><- , -><2 , ->< , ->编辑一个文本文件program.txt,在文件中输入如下内容:if data+92>0x3f thendata=data+01;elsedata=data-01; 正确结果:七、实验报告要求 实验报告应包括以下几个部分:1、词法的正规式描述;2、变换后的 状态图;3、词法分析程序的数据结构与算法。八、思考题1、 词法分析能否采用空格来区分单词?答:不能,因为程序的语法里有包括:;, ,(,)等界符或连接符号存在,这些符号符与单词的连接无空格,用空格区分单词将无法保证程序语法的正确。2、 程序设计中哪些环节影响词法分析的效率?如何提高效率?答:本程序在判断关键字时,是在完成对标志符的识别后,判断该标识符是否是保留字,若是则判断为关键字,这种情况下,导致每次识别完一个标识符,都要查询保留字表,会影响效率,可在识别标识符的程序段中添加对关键字的识别,如首字母的特别判断或遇到数字跳过关键字的判断等。另外,程序的实现是通过在主函数中循环调用scan()函数来输出二元式,一次调用就输出一个二元式,可以考虑使用堆栈,先将读来的数据压栈,再进行识别,这样比重复调用函数效率更高,而且也不必使用文件指针来回调字节,用堆栈会更方便更安全准确,省去不少程序段。专心-专注-专业

    注意事项

    本文(编译原理实验报告2-词法分析程序的设计(共9页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

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




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开