




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上实验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
2、|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、属性为空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、 根据状态图,设计词法分析算法;观察状态图
4、,其中状态2、4、7、10(右上角打了星号)需要回调一个字符。声明一些变量和函数:ch:字符变量,存放最新读进的源程序字符。strToken:字符串变量,存放构成单词符号的字符串。GetChar():子函数,将下一输入字符读到ch中,搜索指示器前移一字符位置。GetBC():子函数,检查ch中的字符是否为空白。若是,则调用GetChar()直至ch中进入一个非空白字符。Concat():子函数,将ch中的字符连接到strToken之后。IsLetter():布尔函数,判断ch中的字符是否为字母。IsDigit():布尔函数,判断ch中的字符是否为数字。Reserve():整型函数,对strTo
5、ken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回0。SearchOp():整型函数,对ch查找运算符和界符,若它是一个运算符或界符,则返回它的编码,否则返回0。Retract():子函数,将搜索指示器回调一个字符位置,将ch置为空白字符。ProError():错误处理函数。关键字保存在字符数组中,定义编码为相对数组首地址的位置 + 1。保留子表顺序如下: if ,then ,else ,while, do ,则相应编码为:1,2,3,4,5。运算符和界符保存在字符数组中,编码定义与关键字相同,顺序如下: + ,- , * , / , >
6、 , < , = , ( , ) , ;,编码为: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 >"
7、;, 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
8、 >", 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+语言,设计函数
9、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;str
10、1 = '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')
11、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;retu
12、rn code;int SearchOP(char ch) /整型函数,对strToken中的字符串查找运算符和界符,若它是一个运算符或界符,则返回它的编码,否则返回0int code = 0, i;char OP11 = '+', '-', '*', '/', '<', '>', '=', '(', ')', '' ;for (i = 0; i < 10; i+) if (ch = OPi) code = i + 1
13、;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
14、 (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'
15、 && 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'
16、; && 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(
17、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;#de
18、fine 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 ,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 行政法学核心原则解析及试题及答案
- VB语言难点突破与试题及答案
- 网络管理员考试的资源整合试题及答案
- 网络管理员实施方案试题及答案总结
- 行政法在区域治理中的应用探讨试题及答案
- 2025年软件设计师考试开发工具选择指导试题及答案
- 2025年软考成功重点及试题及答案
- 掌握程序调试与优化技巧试题及答案
- 中标合作协议书几份
- 面试表现提升的自我训练计划
- 河南工业大学课件模板
- 公司道德和商业行为准则
- DB4417-T 4-2022 地理标志产品 阳江豆豉
- 【年产1000吨富硒沙棘果汁工艺生产设计16000字(论文)】
- 汽车维修合作协议书范本
- HG-T 4062-2023 波形挡边输送带
- 牛背山岩桑坪生态旅游客运索道项目对大熊猫国家公园生态影响评价报告
- 乙状结肠癌根治术手术
- 提水试验过程及数据处理
- (正式版)SHT 3046-2024 石油化工立式圆筒形钢制焊接储罐设计规范
- 呼吸系统(0001)课件
评论
0/150
提交评论