编译原理——语法分析(FIRST集、FOLLOW集、LL(1)文法、预测分析表的构造)

本文详细介绍了编译原理中的语法分析问题,包括左递归、回溯和空字问题的解决方法。通过消除左递归、定义FIRST集和FOLLOW集,构建了LL(1)文法,同时阐述了预测分析表的构造过程。
摘要由CSDN通过智能技术生成

初学编译原理的知识觉得很琐碎也很艰涩,今天在做作业之前,把语法分析这一章节的内容进行了一次梳理,把这部分内容终于串起来了,趁热打铁写下这篇博文。相信我,我能懂,你也能懂!

全文分成如下板块:

  1. 什么是语法分析器
  2. 语法分析中可能存在的问题
  3. 如何解决这些问题(LL(1)文法)
  4. 如何构造预测分析表

1.什么是语法分析器?

先上一张图,虽然不太清晰,但大致能够看出语法分析器在编译程序中的位置。说白了,它就是按文法的产生式,识别输入串是否为一个句子
在这里插入图片描述

可以简单地将语法分析分为自上而下的语法分析与自下而上的语法分析。

而在由开始字符推导出最终结果的过程中,我们会遇到一系列的问题,我们要设计好的语法分析器就要解决好这些问题。

2.自上而下语法分析中可能存在哪些问题?

(1)左递归问题
举个例子,比如P->Pa|b

这可能会造成自上而下语法分析一直迭代的问题。因此我们要解决这个问题,消除左递归:

P->bP’
P’->aP’|ε

消除左递归的式子与原式子是等价的。但是! 这只解决了直接最递归的问题,间接左递归问题并没有得到解决(换个马甲我就不认识你了?)

间接左递归例如:

S->Qc|c
Q->Rb|b
R->Sa|a

说来说去还是会左递归,只不过分了几步而已,那咱就接着消除,令它的非终结符排序为R、Q、S(可以是任何顺序)

把R带入Q,则有:

Q->Sab|ab|b

OK,现在Q不含直接左递归,那我们就把它又放入S中:

S->Sabc|abc|bc|c

然后按照我们之前消除直接左递归的方式进行得到:

S->abcS’|bcS’|c
S’ S’->abcS

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值