从正规式到词法分析讲解.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
从正规式到词法分析器 1 从正规式到NFA 1 从正规式到NFA(续1) 1 从正规式到NFA(续2) 2 从NFA到DFA NFA上识别记号的确定化方法 2 从NFA到DFA(续1) 算法 模拟NFA 2 从NFA到DFA(续2) 2 NFA到DFA(续3) 2 “子集法”构造DFA 2 NFA到DFA(续4) 算法 从NFA构造DFA(子集法) 2 NFA到DFA(续5) 2 NFA到DFA(续6) 3 最小化DFA 算法 最小化DFA的状态数 3 最小化DFA(续1) 最小化DFA算法的主要步骤: 3 最小化DFA(续2) 4 由DFA构造词法分析器 2 直接编码的词法分析器 2 直接编码的词法分析器(续1) 3 两类分析器的比较 5 小结(略) 算法 求ε-闭包 Lex与Yacc 快速入门 Lex 和 Yacc 介绍 lex 和 yacc 是什么 Lex :Lexical Analyzar, 是一种生成扫描器的工具。 Yacc :Yet Another Compiler Compiler lex 和 yacc 是自动编译代码的工具,适合于解析简单的语言。 lex 和 yacc 是一对配对工具。lex 将文件分解为成组的“记号(tokens) ”,大体上类似于单词。yacc 接受成组的记号,并将它们装配为高层次的结构,类似于句子。 yacc 设计用来处理 lex 的输出,不过您也可以编写自己的代码来完成此任务。同样,lex 的输出很大程度上设计用于为某类解析器提供数据。 实验工具简介总揽(1/2) 实验工具简介总揽(2/2) 实验工具简介-LEX Lex:一个词汇分析器生成器 。 当 Lex 接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配。它一次读入一个输入字符,直到找到一个匹配的模式。如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记)。另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex 将显示一个错误消息。 程序有三个部分,用 %% 符号隔开。第一部分和最后一个部分是普通而古老的 C 代码。中间是有趣的一部分。它由一系列规则构成,lex 将这些规则翻译为词汇分析器。每一个规则依次包含一个正则表达式以及该正则表达式得到匹配时要运行的一些代码。任何没有得到匹配的文本则简单地拷贝到标准输出。 Lex 的常规表达式(1) Lex 的常规表达式(2) 常规表达式举例 标记声明举例 Lex 编程 Lex 编程可以分为三步: 以 Lex 可以理解的格式指定模式相关的动作。 在这一文件上运行 Lex,生成扫描器的 C 代码。 编译和链接 C 代码,生成可执行的扫描器。 Lex 的输入格式 一个 Lex 程序分为三个段: 第一段:是 C 和 Lex 的全局声明 第二段:包括模式(C 代码) 第三段:是补充的 C 函数。 这些段以%%来分界。 (1)C 和 Lex 的全局声明 这一段中我们可以增加 C 变量声明。 %{ int wordCount = 0; /*保存统计出来的字数 */ %} chars [A-Za-z] numbers ([0-9])+ delim [ \n\t] whitespace {delim}+ words {chars}+ %% 两个百分号标记指出了 Lex 程序中这一段的结束和三段中第二段的开始。 (2)Lex 的模式匹配规则 {words} { wordCount++; /* increase the word count by one*/ } {whitespace} { /* do nothing*/ } {numbers} { /* one may want to add some processing here*/ } %% (3)C 代码 Lex 编程的第三段,也就是最后一段覆盖了 C 的函数声明(有时是主函数)。Lex 有一套可供使用的函数和变量。 其中之一就是 yywrap。一般来说,yywrap() 的定义如下例。 void main() { yylex(); /* start the analysis*/ printf( No of words: %d\n, wordCount); } int yywrap() {

文档评论(0)

baobei + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档