编译原理——Lex与Yacc及应用

一. 实验原理:

  1. Lex(Lexical Analyzar 词法分析生成器),Yacc(Yet Another Compiler Compiler
    编译器代码生成器)是Unix下十分重要的词法分析,语法分析的工具。经常用于语言分析,公式编译等广泛领域。
  2. Lex工具是一种词法分析程序生成器,它可以根据词法规则说明书的要求来生成单词识别程序,由该程序识别出输入文本中的各个单词。 一般可以分为<定义部分><规则部分><用户子程序部分>。其中规则部分是必须的,定义和用户子程序部分是任选的。
  3. lex和flex都是解析Lex文件的工具,用法相近,flex意为fast lexical analyzer generator。
  4. 可以看成lex的升级版本。
  5. Lex其实就是词法分析器,通过配置文件*.l,依据正则表达式逐字符去顺序解析文件,并动态更新内存的数据解析状态。不过Lex只有状态和状态转换能力。因为它没有堆栈,它不适合用于剖析外壳结构。而yacc增加了一个堆栈,并且能够轻易处理像括号这样的结构。Lex善长于模式匹配,如果有更多的运算要求就需要yacc了。

二. 实验内容:

原理、注释和心得
原理:

  1. LEX是一个词法分析器(扫描器)的自动产生系统
  2. LEX源程序是用一种面向问题的语言写成的?这个语言的核心是正规表达式(正规式),用它描述输入串的词法结构。在这个语言中用户还可以描述当某一个词形被识别出来时要完成的动作,例如在高级语言的词法分析器中,当识 别出一个关键字时,它应该向语法分析器返回该关键字的内部编码。LEX并不是一个完整的语言,它只是某种高级语言(称为LEX的宿主语言)的扩充,因此LEX没有为描述动作设计新的语言,而是借助其宿主语言来描述动作。我们只介绍C作为LEX的宿主语言时的使用方法,在UNIX系统中,FORTRAN语言的一种改进形式RATFOR也可以做LEX的宿主语言。
  3. LEX自动地把表示输入串词法结构的正规式及相应的动作转换成一个宿主语言的程序,即词法分析程序,它有一个固定的名字yylex,在这里yylex是一个C语言的程序。
  4. yylex将识别出输入串中的词形,并且在识别出某词形时完成指定的动作。
    看一个简单的例子:写一个LEX源程序,将输入串中的小写字母转换成相应的大写字母。

程序如下:
%%
[a-z] Printf("%c",yytext[0]+′A′-′a′);

  • 上述程序中的第一行%%是一个分界符,表示识别规则的开始?第二行就是识别规则。左边是识别小写字母的正规式,右边就是识别出小写字母时采取的动作,将小写字母转换成相应的大写字母。
  • LEX的工作原理是将源程序中的正规式转换成相应的确定有限自动机,而相应的动作则插入到yylex中适当的地方,控制流由该确定有限自动机的解释器掌握

调试成功示例代码:
生成cpp相关文件:
在这里插入图片描述
在VS中新建项目:
在这里插入图片描述
将词法分析生成器生成的文件导入到VS中调试运行:
在这里插入图片描述
调试无误,执行测试三组数据:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三. 实验心得

熟悉语法分析器生成工具Yacc的使用,并学会在cygwin下使用bison工具编译Yacc文法说明文件。学习如何使用lex和yacc合作进行语法分析。最初没搞明白词法分析器和语法分析器链接的原理,因此在用gcc编译时总是报错。后来又重新阅读了一遍Yacc使用指南,发现是记号名的问题,修改之后便能编译成功了。
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值