初学编译原理的知识觉得很琐碎也很艰涩,今天在做作业之前,把语法分析这一章节的内容进行了一次梳理,把这部分内容终于串起来了,趁热打铁写下这篇博文。相信我,我能懂,你也能懂!
全文分成如下板块:
- 什么是语法分析器
- 语法分析中可能存在的问题
- 如何解决这些问题(LL(1)文法)
- 如何构造预测分析表
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