从上下文无关文法(CFG)到语法分析树——LL(1)分析法


回顾


在开始之前,我们需要知道自己在做什么。
之前,我们花了不少时间熟悉如何将RE转化为DFA,那么为什么要将RE转换为DFA?这个问题类似于现在为什么要将CFG(上下文无关文法)转换成Parser。在掌握具体的步骤之前,我们有必要说明一下这样做的目的。
首先看一下编译器的模型图:
compiler
为什么要将RE转换到DFA?
相信看过实验一之后这个问题已经非常清楚。实验一我们需要完成一个词法分析器。我们需要自己用正则表达式定义一个语言的成分,比如单词、数字、注释、引用等,分别写出他们对应的NFA,合并NFA并转换成DFA,在得到DFA之后我们可以知道所有的状态和每个状态遇到不同的输入应该如何跳转处理,从DFA生成词法分析的程序。在上一篇文章的一开始,我们也提到了如何从DFA生成程序。词法分析器最终的输出是一个Token序列,记录了lexeme(词)、catalog(种类,就是自己用RE定义的)以及InnnerCode(内部码)
为什么要将CFG转到Parser?
之前我们所做的是词法分析,现在我们需要考虑语法分析的问题,当我们已经定义出一个语言的上下文无关文法,并且拿到了已经分析好的单词序列,我们怎样解析这些单词序列之间的语法关系呢?这类似于如何从有序的单词序列中分析出主语、谓语、宾语。我们需要知道这个单词对应语法中的那种成分,或者这一系列单词究竟符不符合语法要求。

递归下降分析法


有一种很简单的方法可以用来解决这个问题,它叫做递归下降分析法( Recursive Descent Parsing)。
这个方法利用递归与回搠的方法解决问题,核心在于为每个非终结符构造一个函数。

Example: S=>ABC, A=>aA|ε, B=>bB|ε, C=>cC|ε

首先是main函数:

main() {
    i = S();
}
  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
自顶向下语法分析程序是一种根据文法产生式和输入串来识别句子结构的程序。LL(1)语法分析程序则是指具有以下特点的自顶向下分析程序:采用最左推导、具有单符号向前看、只需一个向前符号的语法分析程序。 首先,我们需要构建一个LL(1)分析表,该表是一个二维数组,行代表非终结符,列表示终结符和向前看符号。根据文法产生式和First、Follow集合来填充LL(1)分析表。在填充LL(1)分析表时,需要考虑产生式右部符号串的First集合和Follow集合,以及空串的情况。填充完成后,得到一个非终结符和终结符的组合对应的产生式编号。 接下来,编写LL(1)语法分析程序的分析器部分,该部分通过输入串和LL(1)分析表来进行句子结构的识别。具体而言,分析器根据LL(1)分析表的内容来选择适当的产生式进行推导,并根据对应的产生式推导出输入串的句子结构,直到推导出句子的最左句型。在推导的过程中,需要考虑空串情况,对应选择空串产生式和进行回溯。 最后,对于输入串,LL(1)语法分析程序可以输出句子结构的推导过程或者识别出句子是否符合文法。如果输入句子符合文法,那么LL(1)语法分析程序会给出对应的推导序列和语法分析;如果输入句子不符合文法,LL(1)语法分析程序会报告语法错误的位置和错误类型。 因此,一个典型的LL(1)语法分析程序包括构建LL(1)分析表和编写LL(1)语法分析程序的分析器部分,通过这两部分来实现句子结构的识别和语法错误的检测。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值