Part3词法分析3ppt.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Part3词法分析3ppt

数据库原理与Oracle——SQL语言 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 = LT; return(RELOP);} “=” {yylval = LE; return(RELOP);} “=” {yylval = EQ; return(RELOP);} “” {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传递的。

文档评论(0)

liudao + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档