词法分析--软件开发过程与项目管理综述_第1页
词法分析--软件开发过程与项目管理综述_第2页
词法分析--软件开发过程与项目管理综述_第3页
词法分析--软件开发过程与项目管理综述_第4页
词法分析--软件开发过程与项目管理综述_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

Part3词法分析 授课 胡静 内容提要 词法分析器的作用词法分析程序的设计与实现 状态图词法分析程序的自动生成 有穷自动机 词法分析器的自动产生 LEX工作过程 首先 使用LEX语言写一个定义词法分析器的源程序lex l 然后利用LEX编译器将lex l转换成C语言程序lex yy c 它包括从lex l的正规表达式构造的状态转换图的表格形式以及使用该表格识别词素的标准子程序 与lex l中正规表达式相关联的动作是C代码段 这些动作可以直接加入到lex yy c中 最后 lex yy c通过C编译器生成目标程序 这个目标程序就是把输入流转换成记号序列的词法分析器 LEX工作过程 LEX说明 一个LEX程序由如下三部分组成 声明部分 辅助定义式 转换规则 识别规则 辅助过程 用户子程序 声明部分包括变量声明 符号常量声明和正规定义 声明部分 声明部分举例 LEX识别规则 LEX程序的转换规则是如下形式的语句 P1 A1 P2 A2 pn An LEX程序的第三部分包含action所需要的辅助过程 这些过程可以单独编译 并与词法分析器一起装载 LEX举例 LEX举例 符号常数定义LT LE EQ NE GT GE IF THEN ELSE ID NUMBER RELOP 正规定义 dilim t n ws delim letter A Za z digit 0 9 id letter letter digit number digit digit E digit LEX举例 ws 没有动作和返回值 if return IF then return THEN else return ELSE id yylval install id return ID number yylval install num return NUMBER yylval NE return RELOP yylval GT return RELOP yylval GE return RELOP LEX举例 install id 往符号表填入词素的过程 yytext指向词素的第一个字符 yyleng表示词素的长度 将词素填入符号表 返回指向该词素所在表项的指针 install num 与填写词素的过程类似 只不过词素是一个数 LEX举例说明 假设由上面的程序生成的词法分析器被给定的一个由两个制表符 一个if和一个空格组成的输入串 两个制表符是能与模式ws匹配的初始最长前缀 与ws相关联的动作不做任何事 因此词法分析器移动词素的开始指针yytext使其指向i 并开始查找下一个记号 下一个匹配的词素是if 请注意 模式if和 id 均匹配这个词素 并且没有能匹配更长串的模式 由于上面的程序中匹配关键字if的模式先于匹配标识符的模式执行 所以if被匹配成关键字 通常 采用将匹配关键字的模式置于匹配标识符的模式之前的策略 可以简单有效的保留关键字 假设读入的头两个字符是 模式 匹配上第一个字符 但它不是能匹配输入字符串的最长前缀的模式 LEX采用 选择最长匹配前缀的策略 方便的解决了 和 之间的冲突 这里 当然 被选择作为下一个记号 LEX说明 由LEX创建的词法分析器与语法分析器协同工作的方式如下 词法分析器被语法分析器调用后 从尚未扫描的输入字符串中读字符 每次读入一个字符 直到发现能与某个正规表达式pi匹配的最长前缀 词法分析器执行Ai 通常Ai会将控制返回给语法分析器 然后如果不将控制交给语法分析器 词法分析可以继续发现更多的词素 直到某个操作将控制返回给语法分析器 词法分析器这种不断查找词素 直到以显示的return调用结束工作的方式 使其可以方便的处理空白符和注释 词法分析器只返回记号给语法分析器 带有与词素相关信息的属性值是通过全局变量yylval传递的 超前扫描操作 在LEX中我们可以把模式写成r1 r2的形式 其中r1和r2都是正规表达式 它的意思是当一个字符串与r1匹配时 还需要其后的字符串与r2匹配 这样才算该字符串与r1匹配成功 在超前扫描操作符 后面的正规表达式r2表示需要进一步匹配的内容 这里他只是匹配的一个限制 而不是匹配的一个部分 将Fortran中DO识别为关键字的LEX说明如下 DO501I 1 25DO letter digit letter digit 动作 超前扫描符举例 区别Fortran中的关键字和标识符识别关键字IF的模式可以写为 IF letter 处理Fortran的if语句问题的另一种方法是 当看到字符串IF 后 先确定IF是否被声明为数组 如果是 我们才去匹配上面给出的整个模式 这样的检查使得由LEX说明自动实现一个词法分析器变得很难 而且在运行时可能会花费更多的时间 因为要由模拟状态转化图的程序频繁的判断是否要进行这样的检查 LEX的实现 单个正则表达式 词法分析器 处理多样的REs 将所有的正则表达式的NFA联合在一起 变成一个单一的有限自动机 LEX二义性的处理方法 词法分析器 输出端是Token流将tokens和终态联系在一起 当到达一个终态时 就将相应的token输出 最长匹配当到达一个终态时 要查看是否存在更进一步的转换 如果不存在 则返回当前终态对应的token优先级规则当终态对应多个token

温馨提示

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

评论

0/150

提交评论