编译原理——语法分析

本文介绍了编译原理中的语法分析,重点讨论了自上而下的方法,包括消除文法左递归和回溯的问题。自上而下分析包括递归下降和预测分析,但可能遇到回溯和左递归问题。通过消除直接和间接左递归,以及构造LL(1)文法来避免回溯,确保语法分析过程高效且无误。

语法分析的任务:
分析一个文法的句子的结构
语法分析器的功能:
按照文法的产生式(语言的语法规则) , 识别输入符号串是否为一个句子(合式程序)
语法分析器在编译原理中占主导地位
在这里插入图片描述
语法分析大概分为两类:

  • 自下而上(Bottom-up)
    • 从输入串开始,逐步进行归约,直到文法的开始符号
    • 归约:根据文法的产生式规则,把串中出现的产生式的右部替换成左部符号
    • 从树叶节点开始,构造语法树算符优先分析法、LR分析法
  • 自上而下(Top-down)
    • 从文法的开始符号出发,反复使用各种产生式,寻找"匹配"的推导
    • 推导:根据文法的产生式规则,把串中出现的产生式的左部符号替换成右部
    • 从树的根开始,构造语法树
    • 递归下降分析法、预测分析程序

自上而下(Top-down)

假定有文法G(S):
(1) S->xAy
(2) A->**|*
分析输入串x*y(记为a)。

大致流程:
语法分析器 调用 词法分析器获取x,S无法匹配,生成第一层语法树xAy,此时x匹配成功。
继续调用词法分析器获取*,A无法匹配,生成第二层语法树**,此时*能匹配成功,但是下一个*无法匹配,回溯到A,生成第二层语法树*,此时*匹配成功。
最后调用词法分析器获取y,直接匹配成功。

从上一个问题我们能看到多个产生式候选带来的回溯问题

  • 分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的
  • 出错时,不得不“回溯’

除了回溯问题还有文法左递归问题
一个文法是含有左递归的,如果存在非终结符P,如图:
在这里插入图片描述
当我们要匹配a时,图中式子会产生无穷个子树,形成死循环。

消除文法左递归问题

1.直接左递归的消除

  • 见诸于产生式中的直接左递归:P→Pa |β (β不以P开头)
  • 左递归变右递归
    • P→βP’
    • P’→aP’|ε
  • 推导得它们最终产生的句子都是βa…a
  • 推广到:P-→Pa1| Pa2|… Pam|β1| β2|…|βn 则有:
    • P→β1|P’| β2P’…| β~n ~P’
    • P’→a1P’|a2P’|…| amP’| ε

2.间接左递归的消除
给定文法G(S):
S→Qc|c
Q→Rb|b
R→Sa|a
事实上S、Q、R都是左递归,如S=>Qc=>Rbc=>Sabc
间接左递归的消除

  • 一个文法消除左递归的条件
    • 不含以ε为右部的产生式
    • 不含回路即:P最终推出 P

通过图中推导:
在这里插入图片描述
文法G(S)最终变为了直接左递归,最后用直接左递归的消除,消除左递归。
在这里插入图片描述

消除回溯

为了消除回溯必须保证
对文法的任何非终结符,当要它去匹配输入串时,能够根据它所面临的输入符号准确地指派它的一个候选去执行任务,并且此候选的工作结果应是确信无疑的。
这里引入一个新概念:
在这里插入图片描述
在这里插入图片描述
为了尽量让首符集两两不相交:
在这里插入图片描述
在这里插入图片描述

LL(1)文法

构造不带回溯的自.上而下分析的文法条件
1.文法不含左递归
2.对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交。 即,若
A→a 1|a 2…|an
则FIRST(ai)∩FIRST(aj)=Ø (i≠j)
3.对文法中的每个非终结符A ,若它存在某个候选首符集包含ε,则
FIRST(a i)∩FOLLOW(A)=Ø ;i=1,2…n
如果一个文法G满足以上条件,则称该文法G为LL(1)文法。
第一个L:从左到右扫描输入串
第二个L:最左推导
1:每一步只需向前查看一个单词符号
在这里插入图片描述
FIRST集合算法:
在这里插入图片描述
FOLLOW集合算法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值