3-2-lex介绍.ppt_第1页
3-2-lex介绍.ppt_第2页
3-2-lex介绍.ppt_第3页
3-2-lex介绍.ppt_第4页
3-2-lex介绍.ppt_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、LEX 开发背景,20世纪50年代,开始开发高级语言及其编译器,但此时编译理论不成熟,开发工作复杂而艰苦。 chomsky研究的语言分层体系等理论,以及实践经验的积累,使编译器的构造变得相对简单。 人们开始研究编译器的自动构造。 20世纪70年代开始出现一些编译程序自动生成程序。 如:yacc(语法分析程序生成器), lex(词法分析程序生成器)。,LEX的工作过程,输入文件 *.l,LEX,输出文件 Lex.yy.c,工作:扫描源文件,将源文件中规则部分的正规表达式转换成相应的DFA,并以状态转移矩阵的形式,连同驱动程序yylex,输出到名为lex.yy.c的文件中。该输出文件即为词法分析器

2、。,LEX输入文件格式,definitions 定义部分 % rules 规则部分 % auxiliary routines 辅助程序集/用户程序集部分,由三个部分组成,由位于新一行第1列的“%”分割。,该文件中,信息分为2类: .正则表达式信息 Lex利用这个信息指导构成它的C输出代码 .提供给Lex的真正的C代码 Lex会在适当的位置将它插入到输出代码中。,定义部分 包括:. 由:分隔符“% ”和“% ”扩起的C代码; . 正则表达式的名字定义;,LEX输入文件组成部分,% /* 将数字从10进制转成16进制形式。yytext是Lex 赋予并由正则表达式匹配的串的内部名字, * / #in

3、clude #include int count = 0; % digit 0-9 number digit+ % % ,C程序代码,名字定义,规则部分 由一串带有C代码的正则表达式组成;形如: P1 action 1 P2 action 2 Pn action n Action i 识别出Pi所描述的单词之后, 词法分析器应采取的动作。, % % number int n = atoi (yytext); printf (%x, n); if (n9) count+; % % ,Pi 正规式 action i C程序代码,辅助程序集/用户程序集部分 由一些C代码组成。 .规则部分的actio

4、n所需要的辅助过程; .如果要将Lex输出作为独立程序来编译,则这一 部分还会有一个主程序;, % main( ) yylex ( ); fprintf(stderr,number of replacements = %d,count) ; return 0 ; ,LEX的实现,. 对规则部分的每个正规式Pi,为其构造相应的 NFA Mi (1im)。 . 引入一新的初态S0,并用把 S0 和每个NFA Mi 的初态连接起来,得到描述该扫描器的NFA M 。 . 利用子集法将M确定化,将DFA M 输出。,a abb a*bb* ,例:某LEX输入程序:,. 对Pi,构造NFA Mi,. 引入

5、新初态S0,并用把S0和每个NFA Mi的初态连接起来,得到描述该扫描器的NFA M 。,例:正规式: a、 abb 、 a*bb*,.利用子集法 将M确定化,若有多条规则与被扫描文件中的字符串相匹配,则执行能匹配最长字符串的规则, 称为:“最长匹配原则”; 若有多条规则匹配长度相同的字符串,则选择在LEX源文件中排列最前面的规则进行匹配, 称为:“最先匹配原则”。,核心算法 二义性问题的解决,例:正规式: a、 abb 、 a*bb*,串:aba 可以匹配:a,ab。按最长匹配原则,匹配ab,integer action a-z+ action,例:设有两规则按下面次序给出:,.若输入int

6、egers,则它将被当成标识符处理。 最长匹配原则 integer只能匹配7个字符, 而a-z+能匹配8个字符; .若输入integer,那么它将被当作关键字处理, 最先匹配原则 两条规则都能与之匹配, 但关键字先定义。,核心算法 C代码的插入,.定义部分 % 和 %之间的代码 复制到输出程序的前端。 .规则部分 action的代码段 插入到词法分析程序yylex的恰当位置,并在与对应的正则表达式匹配时执行它。 .辅助程序集部分 复制到输出程序的末尾。,例,% /* 将数字从10进制转成16进制形式。yytext是Lex 赋予 并由正则表达式匹配的串的内部名字, * / #include #i

7、nclude int count = 0; % digit 0-9 number digit+ % number int n = atoi (yytext); printf (%x, n); if (n9) count+; % main() yylex(); fprintf(stderr,number of replacements= %d,count); return 0 ; ,例:某语言Tiny C的lex输入源文件,/*/ /* File: tiny.l Lex specification for TINY */ /* Compiler Construction: Principles

8、and Practice */ /* Kenneth C. Louden */ /*/ % #include globals.h #include util.h #include scan.h /* lexeme of identifier or reserved word */ char tokenStringMAXTOKENLEN+1; % digit 0-9 number digit+ letter a-zA-Z identifier letter+ newline n whitespace t+,定义部分,( return LPAREN; ) return RPAREN; ; retu

9、rn SEMI; number return NUM; identifier return ID; newline lineno+; whitespace /* skip whitespace */ char c; do c = input(); if (c = EOF) break; if (c = n) lineno+; while (c != ); . return ERROR;,% if return IF; then return THEN; else return ELSE; end return END; repeat return REPEAT; until return UN

10、TIL; read return READ; write return WRITE; := return ASSIGN; = return EQ; return LT; + return PLUS; - return MINUS; * return TIMES; / return OVER;,规则部分,% TokenType getToken(void) static int firstTime = TRUE; TokenType currentToken; if (firstTime) firstTime = FALSE; lineno+; yyin = source; yyout = listing; currentToken = yylex(); strncpy(tokenString,yytext,MAXTOKENLEN); if (TraceScan) fprintf(listing,t%d: ,lineno); printToken(currentToken,tokenString); return currentToken; ,辅助程序部分,综合评价,优点: 非常优秀的扫描程序生成器; 可移植

温馨提示

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

评论

0/150

提交评论