欢迎来到天天文库
浏览记录
ID:50465192
大小:231.00 KB
页数:31页
时间:2020-03-09
《编译原理基础——习题与上机题解答 教学课件 作者 刘坚 第6-10章第9章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第9章LEX/YACC解决方案简介9.1LEX/YACC程序设计简介LEX/YACC帮助完成的是语言结构的分析而不是语义的处理。利用LEX/YACC编写编译器有两点同等重要:按照LEX/YACC提供的格式进行文法的设计(包括正规式和产生式);利用LEX/YACC提供的语义接口进行语义处理的程序设计。也就是说,LEX源程序*.l和YACC源程序*.y是文法和C/C++程序语句的混合体,因此编写出好的LEX和YACC源程序就需要了解LEX/YACC的语言规定和它们的工作原理。关于这方面的内容,UNIX系统中均有介绍,另外我们在《编译原理基础》的后继教材《编译原理与技术》中也会有较为详细
2、的讨论,同时有兴趣的读者还可以参考由SchreinerAxelT.编写,Prentice-Hall出版的“IntroductiontoCompilerConstructionWithUNIX”。 这里仅就LEX/YACC的基本工作原理和LEX/YACC源程序的基本结构做一简单介绍,以使读者对使用LEX/YACC构造编译器的方法有一个初步了解,帮助读者阅读理解LEX/YACC源程序并且可以以源程序的框架为基础进行其它应用系统的LEX/YACC程序设计。LEX和YACC的程序结构和工作原理是相似的,相似处以LEX为例。1.LEX源程序结构与LEX的正规式LEX源程序基本结构如下:[
3、声明(declaration)]%%翻译规则(translationrules)[%%用户定义子程序(userdefinedroutines)]它由声明、翻译规则和用户定义子程序三部分组成并且用双百分号%%进行分隔,方括号中的声明和用户定义子程序两部分可以省略,只有翻译规则是必须的,用以规定所构造的词法分析器的正规式。LEX提供的所有正规式形式如下所示,灵活地应用它们是构造词法分析器的关键。语法语义(1)x匹配字符或字符串x。(2)"x"匹配字符或字符串x。(3)x匹配字符x自身,如+(匹配+);或C中的转义字符,如t,等。(4)[xy]匹配或者字符x或者字符y。(5)[
4、x–z]匹配字符x,y或z,“–”表示一个范围,并且要求“–”左边字符小于右 边字符,否则出错。当'–'表示其本身时,要放在方括号的最左或最右。(6)[^x]匹配除x以外的任何一个字符,x可以是若干字符,如[^t]表示除空 格、制表符和换行以外的其它字符。(7).匹配除换行以外的任何其它字符。(8)x*正规式x的闭包。(9)x+正规式x的正闭包(closure-plus)。(10)x
5、y匹配或者正规式x或者正规式y。(11)(x)匹配正规式x本身,()用来改变运算优先级。(12)x?表示正规式x是可省略的。该正规式与x
6、ε等价,其中ε表示空。(13)^x匹配一行开始处
7、的正规式x,如^ABCabcABC中第一个ABC。(14)x$匹配一行结束处的正规式x,如^ABCabcABC中第二个ABC。(15)x/y匹配其后紧跟正规式y之后的正规式x,如[0–9]+/"."EQ.识别输入串35.EQ.I中的35。注意:x$与x/等价。(16)x匹配处于开始条件时的正规式x。(17)x{m,n}匹配m到n个正规式x,如ab{3,5}识别:ababab,abababab或ababababab等。YACC源程序的结构与LEX基本相同,但是它的翻译规则部分不是正规式而是产生式。YACC的产生式形式比较简单,与教材中的产生式形式基本一致,读者通过阅读
8、YACC源程序不难理解。2.LEX编译器输出的C程序结构LEX编译器对声明中的辅助定义和翻译规则进行分析,构造出表驱动型的词法分析器,再添加上LEX源程序中的C语言部分,形成一个完整的C程序文件(XDCFLEX编译后输出的文件名是yylex.c,其中的词法分析器函数名是yylex()),它们由如下几部分顺序组成: 声明的C语言部分 词法分析表 分析表的驱动器(yylex())用户定义子程序 了解LEX工作原理的最好方法是编写一个简单的LEX源程序并编译它得到对应的C源程序,然后将LEX和C源程序进行比较,以理解LEX源程序中的C语言部分与翻译规则部分的关系,从而可以
9、更好地进行词法分析器的设计。YACC输出的C程序的结构与LEX的输出相似,但是其中的分析表和驱动器用于语法分析。3.LEX的语义接口LEX的语义接口包括两部分:用户进行语义处理的C/C++语句和用于返回记号信息的变量或函数值。LEX允许在每个产生式的右边加入C/C++语句,用以对正规式所识别出的记号进行语义处理。如果需要多行C/C++语句,则需要用花括弧“{}”将它们括起来。LEX生成的词法分析器用以返回记号信息的函数值和变量如下:●yylex():它是LEX产生的词
此文档下载收益归作者所有