实验Yacc与Lex快速入门.ppt
《实验Yacc与Lex快速入门.ppt》由会员分享,可在线阅读,更多相关《实验Yacc与Lex快速入门.ppt(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1编译原理电子教案韶关学院计算机系程细柱实验Yacc与Lex快速入门 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望2编译原理电子教案韶关学院计算机系程细柱Lex Lex 和和 Yacc Yacc 介绍介绍lex 和和 yacc 是什么是什么vLex:Lexical Analyzar,是一种生成扫描器的工具。是一种生成扫描器的工具。Yacc:Yet Another Compiler Compiler vlex 和和 yacc 是是自动编译代码的工具自动编译代码的工
2、具,适合于解析简单,适合于解析简单的语言。的语言。vlex 和和 yacc 是一对配对工具。是一对配对工具。lex 将文件分解为成组的将文件分解为成组的“记号(记号(tokens)”,大体上类似于单词。,大体上类似于单词。yacc 接受接受成组的记号,并将它们装配为高层次的结构,类似于成组的记号,并将它们装配为高层次的结构,类似于句子。句子。vyacc 设计用来处理设计用来处理 lex 的输出,不过您也可以编写自的输出,不过您也可以编写自己的代码来完成此任务。同样,己的代码来完成此任务。同样,lex 的输出很大程度的输出很大程度上设计用于为某类解析器提供数据。上设计用于为某类解析器提供数据。3
3、编译原理电子教案韶关学院计算机系程细柱实验工具简介总揽实验工具简介总揽(1/2)LEXYACC代码产生支撑函数4编译原理电子教案韶关学院计算机系程细柱实验工具简介总揽实验工具简介总揽(2/2)5编译原理电子教案韶关学院计算机系程细柱实验工具简介-LEXLex:一个词汇分析器生成器:一个词汇分析器生成器。当当 Lex 接收到文件或文本形式的输入时,它试图将文接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配。它一次读入一个输入字符,本与常规表达式进行匹配。它一次读入一个输入字符,直到找到一个匹配的模式。如果能够直到找到一个匹配的模式。如果能够找到一个匹配的找到一个匹配的模式模式,Le
4、x 就执行相关的动作就执行相关的动作(可能包括返回一个标(可能包括返回一个标记)。另一方面,如果记)。另一方面,如果没有没有可以匹配的常规表达式,可以匹配的常规表达式,将会将会停止停止进一步的处理,进一步的处理,Lex 将将显示一个错误消息显示一个错误消息。程序有三个部分,用程序有三个部分,用%符号隔开。符号隔开。第一部分和最后一第一部分和最后一个部分个部分是普通而是普通而古老的古老的 C 代码代码。中间中间是有趣的一部分。是有趣的一部分。它它由一系列规则构成由一系列规则构成,lex 将这些规则翻译为词汇分析将这些规则翻译为词汇分析器。每一个规则依次包含一个正则表达式以及该正则器。每一个规则依
5、次包含一个正则表达式以及该正则表达式得到匹配时要运行的一些代码。任何没有得到表达式得到匹配时要运行的一些代码。任何没有得到匹配的文本则简单地拷贝到标准输出。匹配的文本则简单地拷贝到标准输出。6编译原理电子教案韶关学院计算机系程细柱Lex 的常规表达式(的常规表达式(1)字符字符 含含义 A-Z,0-9,a-z 构成了部分模式的字符和数字。构成了部分模式的字符和数字。.匹配任意字符,除了匹配任意字符,除了 n。-用来指定范用来指定范围。例如:。例如:A-Z 指从指从 A 到到 Z 之之间的所有的所有字符。字符。一个字符集合。匹配括号内的一个字符集合。匹配括号内的 任意任意 字符。如果第一字符。如
6、果第一个字符是个字符是 那么它表示否定模式。例如:那么它表示否定模式。例如:abC 匹配匹配 a,b 和和 C中的任何一个。中的任何一个。*匹配匹配 0个个或者多个上述的模式。或者多个上述的模式。+匹配匹配 1个个或者多个上述模式。或者多个上述模式。?匹配匹配 0个或个或1个个上述模式。上述模式。$作作为模式的最后一个字符匹配一行的模式的最后一个字符匹配一行的结尾。尾。7编译原理电子教案韶关学院计算机系程细柱Lex 的常规表达式(的常规表达式(2)字符字符 含含义 指出一个模式可能出指出一个模式可能出现的次数。的次数。例如:例如:A1,3 表示表示 A 可能出可能出现1次或次或3次。次。用来用
7、来转义元字符。同元字符。同样用来覆盖字符在此表中定用来覆盖字符在此表中定义的特殊意的特殊意义,只取字符的本意。,只取字符的本意。否定。否定。|表达式表达式间的的逻辑或。或。字符的字面含字符的字面含义。元字符具有。元字符具有。/向前匹配。如果在匹配的模版中的向前匹配。如果在匹配的模版中的“/”后跟有后后跟有后续表达式,只匹配模版中表达式,只匹配模版中“/”前面的部分。如:前面的部分。如:如果如果输入入 A01,那么在模版,那么在模版 A0/1 中的中的 A0 是匹是匹配的。配的。()将一系列常将一系列常规表达式分表达式分组。8编译原理电子教案韶关学院计算机系程细柱常规表达式举例常规表达式举例常常
8、规表达式表达式 含含义 jokers 匹配匹配 jokes 或或 joker。A1,2shis+匹配匹配 AAshis,Ashis,Ashiss,Ashisss。(Ab-e)+匹配在匹配在 A 出出现位置后跟随的从位置后跟随的从 b 到到 e 的的所有字符中的所有字符中的 1 个或个或 多个。多个。9编译原理电子教案韶关学院计算机系程细柱标记声明举例标记声明举例标记 相关表达式相关表达式 含含义 数字数字(number)(0-9)+1个或多个数字个或多个数字字符字符(chars)A-Za-z任意字符任意字符空格空格(blank)一个空格一个空格字字(word)(chars)+1个或多个个或多个
9、 chars 变量量(variable)(字符字符)+(数字数字)*(字符字符)*(数字数字)*10编译原理电子教案韶关学院计算机系程细柱Lex 编程编程Lex 编程可以分为三步:编程可以分为三步:以以 Lex 可以理解的格式指定模式相关的动作。可以理解的格式指定模式相关的动作。在这一文件上运行在这一文件上运行 Lex,生成扫描器的,生成扫描器的 C 代码。代码。编译和链接编译和链接 C 代码,生成可执行的扫描器。代码,生成可执行的扫描器。Lex 的输入格式的输入格式 一个一个 Lex 程序分为三个段:程序分为三个段:第一段:是第一段:是 C 和和 Lex 的全局声明的全局声明第二段:包括模式
10、(第二段:包括模式(C 代码)代码)第三段:是补充的第三段:是补充的 C 函数。函数。这些段以这些段以%来分界。来分界。11编译原理电子教案韶关学院计算机系程细柱(1)C 和和 Lex 的全局声明的全局声明 这一段中我们可以增加这一段中我们可以增加 C 变量声明。变量声明。%int wordCount=0;/*保存统计出来的字数保存统计出来的字数*/%chars A-Za-z numbers (0-9)+delim nt whitespace delim+words chars+%两个百分号标记指出了两个百分号标记指出了 Lex 程序中这一段的结束和程序中这一段的结束和三段中第二段的开始。三段
11、中第二段的开始。12编译原理电子教案韶关学院计算机系程细柱(2)Lex 的模式匹配规则的模式匹配规则words wordCount+;/*increase the word count by one*/whitespace /*do nothing*/numbers /*one may want to add some processing here*/%13编译原理电子教案韶关学院计算机系程细柱(3)C 代码代码 Lex 编程的第三段,也就是最后一段覆盖了编程的第三段,也就是最后一段覆盖了 C 的函数声明(有时是主函数)。的函数声明(有时是主函数)。Lex 有一套可供有一套可供使用的函数和变
12、量。使用的函数和变量。其中之一就是其中之一就是 yywrap。一。一般来说,般来说,yywrap()的定义如下例的定义如下例。void main()yylex();/*start the analysis*/printf(No of words:%dn,wordCount);int yywrap()return 1;14编译原理电子教案韶关学院计算机系程细柱Lex 变量变量Lex 有几个函数和变量提供了不同的信息,可以用来编译有几个函数和变量提供了不同的信息,可以用来编译实现复杂函数的程序。下表中列出了一些变量和函数,以实现复杂函数的程序。下表中列出了一些变量和函数,以及它们的使用。及它们的使
13、用。yyinFILE*类型。型。它指向它指向 lexer 正在解析的当前文件。正在解析的当前文件。yyoutFILE*类型。型。它指向它指向记录 lexer 输出的位置。出的位置。缺缺省情况下,省情况下,yyin 和和 yyout 都指向都指向标准准输入和入和输出。出。yytext匹配模式的文本存匹配模式的文本存储在在这一一变量中(量中(char*)。)。yyleng给出匹配模式的出匹配模式的长度。度。yylineno 提供当前的行数信息。(提供当前的行数信息。(lexer不一定支持。)不一定支持。)15编译原理电子教案韶关学院计算机系程细柱Lex 函数函数yylex()这一函数开始分析。一函
14、数开始分析。它由它由 Lex 自自动生成。生成。yywrap()这一函数在文件(或一函数在文件(或输入)的末尾入)的末尾调用。如果函用。如果函数的返回数的返回值是是1,就停止解析。,就停止解析。因此它可以用因此它可以用来解析多个文件。代来解析多个文件。代码可以写在第三段,可以写在第三段,这就就能能够解析多个文件。解析多个文件。方法是使用方法是使用 yyin 文件指文件指针(见上表)指向不同的文件,直到所有的文上表)指向不同的文件,直到所有的文件都被解析。最后,件都被解析。最后,yywrap()可以返回可以返回 1 来来表示解析的表示解析的结束。束。yyless(int n)这一函数可以用来送回
15、除了前一函数可以用来送回除了前n 个字符外的所有个字符外的所有读出出标记。yymore()这一函数告一函数告诉 Lexer 将下一个将下一个标记附加到当前附加到当前标记后。后。16编译原理电子教案韶关学院计算机系程细柱例:识别例:识别PL/0单词的单词的LEX程序程序%#include#include “code.h”#include “symbol.h”#include “y.tab.h”extern int level;int cc=0;%IDENT a-zA-Z a-zA-Z0-9*NUMBER 0-90-9*%17编译原理电子教案韶关学院计算机系程细柱“cc+;“t“tablize()
16、;/*adjust cc to tab-position*/“n“cc=0;line_copy();/*copy a line of input file*/“cc+;return GT;“=“cc+;return ET;“#“cc+;return NT;“,“cc+;return colon;“.“cc+;return Period;“(“cc+;return Lparen;“)“cc+;return Rparen;“=“cc+;cc+;return GE;“:=“cc+;cc+;return ASGN;“;“cc+;return Semicolon;18编译原理电子教案韶关学院计算机系程细
17、柱NUMBER int n;cc+=yyleng;sscanf(yytext,”%d”,&n);yylval.numder=n;return NUMBER;IDENT Symbol *s;cc+=yyleng;if(s=lookup(yytext)=0)s=install(yytext,VARIABLE,level,0);if(s-type=C)yylval.numder=s-adr;else yylval.sym=s;return s-type;%19编译原理电子教案韶关学院计算机系程细柱int yywrap()return 1;20编译原理电子教案韶关学院计算机系程细柱实验工具简介实验工具
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 Yacc Lex 快速 入门
限制150内