flex与bison应用实例

Flex应用实例:

1)  从标准输入中逐行读取待检验的字符串。使用正则表达式匹配 IPv4 地址,若匹配失败则输出 Invalid ,若匹配成功则输出 IPv4 地址的类别。

2)   从标准输入中读取 DOT 文件,文件无词法、语法错误。
   根据 token.txt 使用正则表达式匹配 token 并且输出。
   Flex 中必须使用 C 代码,无需自定义 main 、 yywarp 函数, gcc编译时添加 -lf 或者 -ll 选项即可自动链接这些函数。
   DOT 关键词大小写不敏感。
   DOT 只包含英文字母和符号,即在 ASCII 范围内。
   DOT 的 ID 与 C 语言相同, STRING 里面可包含转义的双引号,即 \" 。

相关参考资料:http://lesliezhu.github.io/public/flex.html

相关代码和输入输出文件:https://github.com/sysuKinthon/Compile/tree/master/FLEX

Bison应用实例:

使用Flex、Bison解释正则表达式,以文本方式输出其语法结构。

例子

主要参考资料:http://epaperpress.com/lexandyacc/

相关代码和输入输出文件:https://github.com/sysuKinthon/Compile/tree/master/Bison

体会:这个主要是理解如何去构建一个没有二义性的产生式来解决正则的匹配问题,以下对产生式说明下:

                                     

对于产生式的构建:

a)一个规则单元尽量不要使用exp:exp exp的形式,而要使用左递归的形式,比如上图中的concat产生式;

b)为了防止规约/规约冲突,将规则(不同的非终结符的语法规则)按照自上而下(规约的顶层为上)的顺序排列,上面的规则会代先,也就是说在我们的文法中我们就定义好我们的优先级。

可以借鉴:

   

我们以ab|cd这个输入来说明,其输出应该为Alt(Cat(Lit(a), Lit(b)), Cat(Lit(c), Lit(d))),是怎么运行的
首先yyparse调用yylex得到一个Lit类型的token,其匹配到了single:Lit这个产生式,产生的single又匹配了bracket:single,同理将会发生exp:bracket, concat:exp的匹配,到这里,发生的规约与移入冲突,也就是alt:concat要求规约,concat:concat exp要求移入(编译是向前看一步的,b可以规约到exp,所以提示要移入),在Bison中在规约与移入冲突中的优先移入的;所以就会发生b的token移入,同时到达concat:concat exp后就会规约到一个concat,接下来再到alt:concat后,alt:alt "|" concat提示要移入。所以最后就会产生Alt(Cat(Lit(a), Lit(b)), Cat(Lit(c), Lit(d)))这样的一棵语法树(语法树的文本型需要根据自己构建的语法树来生成)

转载于:https://www.cnblogs.com/kinthon/p/4983078.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: flexbison是一对常用于编译器开发的工具,它们可以帮助程序员快速地构建词法分析器和语法分析器。flex用于生成词法分析器,帮助将输入的字符流分割成词法单元,并根据一定规则进行识别。bison则用于生成语法分析器,帮助检查和分析词法单元的组合方式是否符合语法规则。两者配合使用可以辅助编译器进行词法分析和语法分析的工作。 flexbison的中文版pdf是指这两个工具的文档或教程的中文版本的电子书。这种形式的教材对于汉语为母语的程序员来说更加方便,能够更好地理解和使用这两个工具。在这份中文版的pdf教材中,会详细介绍flexbison的相关概念、用法和实例,帮助读者了解它们的基本原理和具体工作方式。 这份pdf教材会从基础开始介绍flexbison的使用,包括如何定义词法规则、如何生成词法分析器和语法分析器等。同时,还会介绍一些高级功能和技巧,如如何处理错误、如何进行语法树的构建等等。读者可以根据自己的需求和项目的实际情况,选择性地学习和应用这些知识。 总之,flexbison是编译器开发中常用的工具,在学习和使用过程中有一些复杂和抽象的概念。因此,拥有一份中文版的pdf教材可以帮助程序员更好地理解和掌握这两个工具的使用方法和技巧。 ### 回答2: FlexBison是一对强大的编译工具,用于生成词法分析器和语法分析器。它们是以C语言为基础开发的,并且非常适用于编译器的设计和开发。 Flex是一个词法分析器生成器,用于将输入的源代码分解成一系列的词法单元。它根据用户定义的正则表达式规则,可以快速地生成高效的词法分析器代码。Flex的使用非常简单,只需要编写一个包含正则表达式规则的输入文件,然后运行Flex命令即可生成词法分析器的C源代码。开发者可以根据需要对生成的代码进行自定义,以实现特定的词法分析功能。 Bison是一个语法分析器生成器,它可以根据用户提供的语法规则生成语法分析器的代码。Bison使用的是LALR(1)算法,可以进行语法检查和分析,判断输入的源代码是否符合给定的语法规则。开发者可以通过定义语法规则、语义动作以及错误处理机制,来生成符合自己需求的语法分析器。Bison生成的语法分析器代码以C语言形式呈现,开发者可以根据需要对代码进行修改和扩展。 FlexBison通常一起使用,协同工作,构建一个完整的编译器。Flex负责将源代码分解成词法单元,Bison负责对词法单元进行语法分析和语义处理。通过灵活地配合使用,可以高效地实现各种编译器功能,例如错误检查、语法树构建和中间代码生成等。 总之,FlexBison是一对非常实用的编译工具,通过它们可以快速生成词法分析器和语法分析器的代码。它们在编译器设计和开发过程中扮演着重要的角色,为开发者提供了强大的功能和灵活的定制能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值