实验Yacc与Lex快速入门.ppt
《实验Yacc与Lex快速入门.ppt》由会员分享,可在线阅读,更多相关《实验Yacc与Lex快速入门.ppt(39页珍藏版)》请在三一办公上搜索。
1、Lex与Yacc 快速入门,授课教师:程细柱,系别:计算机科学系,Lex 和 Yacc 介绍,lex 和 yacc 是什么Lex:Lexical Analyzar,是一种生成扫描器的工具。Yacc:Yet Another Compiler Compiler lex 和 yacc 是自动编译代码的工具,适合于解析简单的语言。lex 和 yacc 是一对配对工具。lex 将文件分解为成组的“记号(tokens)”,大体上类似于单词。yacc 接受成组的记号,并将它们装配为高层次的结构,类似于句子。yacc 设计用来处理 lex 的输出,不过您也可以编写自己的代码来完成此任务。同样,lex 的输出很
2、大程度上设计用于为某类解析器提供数据。,实验工具简介总揽(1/2),实验工具简介总揽(2/2),实验工具简介-LEX,Lex:一个词汇分析器生成器。当 Lex 接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配。它一次读入一个输入字符,直到找到一个匹配的模式。如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记)。另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex 将显示一个错误消息。程序有三个部分,用%符号隔开。第一部分和最后一个部分是普通而古老的 C 代码。中间是有趣的一部分。它由一系列规则构成,lex 将这些规则翻译为词汇分析器。每一个
3、规则依次包含一个正则表达式以及该正则表达式得到匹配时要运行的一些代码。任何没有得到匹配的文本则简单地拷贝到标准输出。,Lex 的常规表达式(1),Lex 的常规表达式(2),常规表达式举例,标记声明举例,Lex 编程Lex 编程可以分为三步:以 Lex 可以理解的格式指定模式相关的动作。在这一文件上运行 Lex,生成扫描器的 C 代码。编译和链接 C 代码,生成可执行的扫描器。Lex 的输入格式 一个 Lex 程序分为三个段:第一段:是 C 和 Lex 的全局声明第二段:包括模式(C 代码)第三段:是补充的 C 函数。这些段以%来分界。,(1)C 和 Lex 的全局声明 这一段中我们可以增加
4、C 变量声明。%int wordCount=0;/*保存统计出来的字数*/%chars A-Za-z numbers(0-9)+delim nt 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 编程的第三段,
5、也就是最后一段覆盖了 C 的函数声明(有时是主函数)。Lex 有一套可供使用的函数和变量。其中之一就是 yywrap。一般来说,yywrap()的定义如下例。void main()yylex();/*start the analysis*/printf(No of words:%dn,wordCount);int yywrap()return 1;,Lex 变量,Lex 有几个函数和变量提供了不同的信息,可以用来编译实现复杂函数的程序。下表中列出了一些变量和函数,以及它们的使用。,Lex 函数,例:识别PL/0单词的LEX程序,%#include#include“code.h”#include
6、“symbol.h”#include“”extern int level;int cc=0;%IDENT a-zA-Z a-zA-Z0-9*NUMBER 0-90-9*%,“cc+;“t“tablize();/*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+;
7、return Rparen;“=“cc+;cc+;return GE;“:=“cc+;cc+;return ASGN;“;“cc+;return Semicolon;,NUMBER int n;cc+=yyleng;sscanf(yytext,”%d”,%,int yywrap()return 1;,实验工具简介-YACC,yacc:另一个编译器的编译器 将输入拆分为一连串的记号。现在您需要一些方法来识别高层次的模式。这就是 yacc 要做的:yacc 让您可以描述希望怎样处理记号。,1.E-E+E2.E-E*E3.E-id,1.x+y*z shift 2 x.+y*z reduce(r3)3
8、 E.+y*z shift 4 E+.y*z shift 5 E+y.*z reduce(r3)6 E+E.*z shift 7 E+E*.z shift 8 E+E*z.reduce(r3)9 E+E*E.reduce(r2)emit multiply 10 E+E.reduce(r1)emit add 11 E.accept,Input:x+y*z,用 Yacc 编写语法 如同 Lex 一样,一个 Yacc 程序也用双百分号分为三段。它们是:声明、语法规则和 C 代码。,C 与 Yacc 的声明C 声明可能会定义动作中使用的类型和变量,以及宏。还可以包含头文件。每个 Yacc 声明段声明了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 Yacc Lex 快速 入门

链接地址:https://www.31ppt.com/p-6270377.html