- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
处理多个模式的方法 词法分析器需要匹配多个模式 解决方法 按照优先级,顺序地尝试各个状态转换图。如果引发fail(),回退并尝试下一个状态图。 更好的方法:“并行地”运行各个状态转换图。通过greedy策略,识别最长的和某个模式匹配的输入前缀 实际使用的方法:预先把各个状态转换图合成一个状态转换图,然后运行这个状态转换图。 精品 内容 词法分析器的作用 词法单元的规约 词法单元的识别 词法分析器生成工具Lex 有穷自动机 从正则表达式到自动机 词法分析器生成工具的设计方法 精品 词法分析工具Lex/Flex Lex/Flex是一个有用的词法分析器生成工具 通常和Yacc一起使用,生成编译器的前端 精品 Lex源程序的结构 声明部分包含: 明示常量:表示常数的标识符 正则定义 转换规则 模式 {动作} 模式是正则表达式 动作表示识别到相应模式时采取的处理方式。 辅助函数 各个动作中使用的函数 声明部分 %% 转换规则 %% 辅助函数 Lex程序的形式 精品 词法分析器的工作方式 Lex生成的词法分析器作为一个函数被调用; 在每次调用过程中,不断读入余下的输入符号 发现最长的、与某个模式匹配的输入前缀时,调用相应的动作; 该动作进行相关处理,并把控制返回; 如果不返回,则词法分析器继续寻找其它词素。 精品 Lex程序的例子(1) %{和}%之间的内容一般被直接拷贝到lex.yy.c中; 这里的内容就是一段注释; LT,LE等的值在yacc源程序中定义 正则定义 分隔声明部分和转换规则部分。 精品 Lex程序的例子(2) 没有返回,表示继续识别其它词法单元 把识别到的标识符加入标识符表 识别到数字常量,加入常量表 精品 Lex程序的例子(3) Lex处理源程序时,辅助函数被直接拷贝到lex.yy.c中 辅助函数可在规则中直接调用 精品 Lex中的冲突解决方法 冲突:多个输入前缀与某个模式相匹配,或者一个前缀和多个模式匹配 Lex解决冲突的方法 多个前缀可能匹配时,选择最长的前缀 保证词法分析器把=当作一个词法单元识别 某个前缀和多个模式匹配时,选择列在前面的模式 如果保留字的规则在标识符的规则之前,词法分析器将识别出保留字 精品 有穷自动机 本质上和状态转换图相同 区别 有穷自动机只回答Yes/No 区分为两类: 不确定的有穷自动机(Nondeterministic Finite Automata,NFA):边上的标号没有限制,一个符号可出现在离开同一个状态的多条边上, ε 可以做标号 确定的有穷自动机( Deterministic Finite Automata, DFA)对于每个状态以及每个符号,有且只有一条边(某些地方是说:最多只有一条边)。 两种自动机都识别正则语言,即对于每个可以用正则表达式描述的语言,就可以用某个NFA或者DFA来识别;反之亦然 精品 不确定的有穷自动机 NFA的定义 一个有穷的状态集合S 一个输入符号集合Σ(input alphabet) 转换函数(transition function)对于每个状态和Σ U{ε}中的符号,给出相应的后继状态集合 S中的某个状态s0被指定为开始状态/初始状态(有些定义中可以有多个开始状态) S的一个子集被指定为接受状态 精品 NFA的例子 状态集合S={0,1,2,3} 开始状态0 接受状态集合{3} 转换函数: (0,a)?{0,1} (0,b)?{0} (1,b)?2 (2,b)?3 相应的图形表示 精品 转换表(transition table)表示法 用二维表表示NFA的转换函数 每行对应于一个状态, 每列对应于一个输入符号或者ε。 每个条目表示对应的后继状态集合 转换表表示法 精品 输入字符串的接受 一个NFA接受输入字符串x,当且仅当对应的转换图中存在一条从开始状态到某个接受状态的路径,该路径中各条边上的标号按顺序组成x(不含 ε 标号)。 前面的NFA接受aabb,因为: NFA接受的语言:从开始状态到达接受状态的所有路径的标号串的集合。 即:该NFA接受的所有符号串的集合 精品 NFA和相应语言的例子 相应的语言:L(aa*|bb*) 精品 确定有穷自动机(DFA) 一个NFA被称为DFA,如果 没有标号为ε的转换 对于每个状态s和每个输入符号a,有且仅有一条标号为a的离开s的边 可以高效判断一个串能否被一个DFA接受。 每个NFA都有一个等价的DFA。 精品 DFA的模拟运行 假设输入符号就是字符; Nextchar读入下一个字符(符号) move给出了离开s,标号为c的边的目标状态 精品 DFA的例子 假设输入为ababb,那么进入的状态序列为 0,1,2,1,2,3 精品 从正则表达式到自动机的转换 正则表
原创力文档


文档评论(0)