编译原理基础——习题与上机题解答 教学课件 作者 刘坚 第6-10章第9章.ppt

编译原理基础——习题与上机题解答 教学课件 作者 刘坚 第6-10章第9章.ppt

ID:50465192

大小:231.00 KB

页数:31页

时间:2020-03-09

编译原理基础——习题与上机题解答 教学课件 作者 刘坚 第6-10章第9章.ppt_第1页
编译原理基础——习题与上机题解答 教学课件 作者 刘坚 第6-10章第9章.ppt_第2页
编译原理基础——习题与上机题解答 教学课件 作者 刘坚 第6-10章第9章.ppt_第3页
编译原理基础——习题与上机题解答 教学课件 作者 刘坚 第6-10章第9章.ppt_第4页
编译原理基础——习题与上机题解答 教学课件 作者 刘坚 第6-10章第9章.ppt_第5页
资源描述:

《编译原理基础——习题与上机题解答 教学课件 作者 刘坚 第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产生的词

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。