参考:

https://www.cnblogs.com/w4ngzhen/p/13817077.html

BNF范式(巴科斯范式)简介

BNF 规定是推导规则(产生式)的集合,写为:
<符号> ::= <使用符号的表达式>
这里的 <符号>是非终结符,而表达式由一个符号序列,或用指示选择的竖杠'|' 分隔的多个符号序列构成,每个符号序列整体都是左端的符号的一种可能的替代。从未在左端出现的符号叫做终结符。

编译原理文法定义为四元集文法递进(S_型文法到q_型文法再到LL(1))) - 图1 文法递进(S_型文法到q_型文法再到LL(1))) - 图2非终结符集合
文法递进(S_型文法到q_型文法再到LL(1))) - 图3终结符集合
文法递进(S_型文法到q_型文法再到LL(1))) - 图4 产生式集合 文法递进(S_型文法到q_型文法再到LL(1))) - 图5 START 闭包与正闭包: ∑的正闭包: ∑+=∑∪∑2∪∑3∪∑4∪…… ∑的克林闭包(kleene Closure): ∑=∑0∪∑+(与正闭包区别哦,这算是新概念) 例如:{0,1}+ = {0,1,00,01,11,000,001,010,011,100,……} {0,1} = {ε,0,1,00,01,11,000,001,010,011,100,…}

S_型文法

  • 每个产生式的右部都以终结符开始
  • 同一非终结符的各个候选式的首终结符不同

例子如下:
文法递进(S_型文法到q_型文法再到LL(1))) - 图6
显然符合上述特点
对于字符串abc,可得到如下推导
文法递进(S_型文法到q_型文法再到LL(1))) - 图7
即对于每个读入的字符,S_型文法可直接确定对应的产生式。
对于流程第2部,文法递进(S_型文法到q_型文法再到LL(1))) - 图8

FOLLOW集

非终结符文法递进(S_型文法到q_型文法再到LL(1))) - 图9的后继符号集,即 可能在某个句型中紧跟在文法递进(S_型文法到q_型文法再到LL(1))) - 图10后边的终结符文法递进(S_型文法到q_型文法再到LL(1))) - 图11的集合,记为文法递进(S_型文法到q_型文法再到LL(1))) - 图12

文法递进(S_型文法到q_型文法再到LL(1))) - 图13
为了解决文法递进(S_型文法到q_型文法再到LL(1))) - 图14产生式问题。即当前某终结符文法递进(S_型文法到q_型文法再到LL(1))) - 图15的产生式右部的首字符与输入文法递进(S_型文法到q_型文法再到LL(1))) - 图16不匹配时,若存在文法递进(S_型文法到q_型文法再到LL(1))) - 图17,则检查文法递进(S_型文法到q_型文法再到LL(1))) - 图18是否存在于文法递进(S_型文法到q_型文法再到LL(1))) - 图19的后续符号集文法递进(S_型文法到q_型文法再到LL(1))) - 图20,若在其中,则继续匹配,否则报错。

SELECT集

可选用该产生式,进行推导时的,输入符号的集合

image.png
解释:

  • 文法递进(S_型文法到q_型文法再到LL(1))) - 图22 : 即用该产生式进行推导时, 对应的输入符号是,文法递进(S_型文法到q_型文法再到LL(1))) - 图23
  • 文法递进(S_型文法到q_型文法再到LL(1))) - 图24 非终结符A推导至终结符文法递进(S_型文法到q_型文法再到LL(1))) - 图25, 则对应输入符号集合为,A的后续符号集合文法递进(S_型文法到q_型文法再到LL(1))) - 图26

    q_文法

  • 每个产生式的右部以文法递进(S_型文法到q_型文法再到LL(1))) - 图27或终结符开始

  • 具有相同左部的产生式,有不可相交的可选集

    FIRST集

    该集合存储产生式右部的串(无论是文法递进(S_型文法到q_型文法再到LL(1))) - 图28、终结符、非终结符)的所有串首为终结符的集合。

image.png
image.png

LL(1)型文法

定义

image.png
对于情况1,反证法如下,若文法递进(S_型文法到q_型文法再到LL(1))) - 图32 均不能推导出文法递进(S_型文法到q_型文法再到LL(1))) - 图33,假设两者的串首终结符集的交集不为空,那么对于某个输入字符c,到底该选择哪一个产生式呢?显然出现了二义性,故交集为空
对于情况2,反证法如下,若文法递进(S_型文法到q_型文法再到LL(1))) - 图34 均能推导出文法递进(S_型文法到q_型文法再到LL(1))) - 图35,假设文法递进(S_型文法到q_型文法再到LL(1))) - 图36,对于某个输入字符c,需要靠文法递进(S_型文法到q_型文法再到LL(1))) - 图37来判断选择哪一个产生式,故由于交集非空,产生二义性,故交集为空

进一步分析

image.png
由上述情况2可知,文法递进(S_型文法到q_型文法再到LL(1))) - 图39 ,且文法递进(S_型文法到q_型文法再到LL(1))) - 图40 ,为了保证不出现二义性,确保
文法递进(S_型文法到q_型文法再到LL(1))) - 图41 ,此处文法递进(S_型文法到q_型文法再到LL(1))) - 图42

文法递进(S_型文法到q_型文法再到LL(1))) - 图43 ,显然情况2得