📜  LL(1)解析表的构造

📅  最后修改于: 2021-06-28 07:12:26             🧑  作者: Mango

先决条件–自上而下的解析器的分类,第一个集合,第二个集合
自上而下的解析器从开始非终端开始,自上而下地构建解析树。自上而下的解析器有两种类型:

  1. 具有回溯功能的自上而下的解析器
  2. 自上而下的解析器,无回溯

没有回溯的自上而下的解析器可以进一步分为两部分:

在本文中,我们将讨论非递归下降,也称为LL(1)解析器。

LL(1)解析:
这里的第一个L表示输入的扫描将以从左到右的方式进行,第二个L表示在此解析技术中,我们将使用最左派生树。最后1代表向前看的次数,表示您要做出决定时要看到多少个符号。

LL(1)解析表的构造:
要构造解析表,我们有两个功能:

1: First() 如果有一个变量,并且如果我们尝试驱动所有字符串,则从该变量开始,则将起始的终端符号称为第一个。

2: Follow() 在导出过程中跟随变量的终端符号是什么。

现在,在为每个非终端符号计算“第一”和“跟随”集之后,我们必须构造解析表。在表格中,“行”将包含“非终端”,而“列”将包含“终端符号”。
语法的所有Null作品都将位于Follow元素下,其余作品将在First set元素下。

现在,让我们看一个例子。

示例1:
考虑语法:

E --> TE'
E' --> +TE' | e                 
T --> FT'
T' --> *FT' | e
F --> id | (E)

**e denotes epsilon

找到他们的第一个和跟随的集合:

  First Follow
E –> TE’ { id, ( } { $, ) }
E’ –> +TE’/e { +, e } { $, ) }
T –> FT’ { id, ( } { +, $, ) }
T’ –> *FT’/e { *, e } { +, $, ) }
F –> id/(E) { id, ( } { *, +, $, ) }

现在,LL(1)解析表为:

  id + * ( ) $
E E –> TE’     E –> TE’    
E’   E’ –> +TE’     E’ –> e E’ –> e
T T –> FT’     T –> FT’    
T’   T’ –> e T’ –> *FT’   T’ –> e T’ –> e
F F –> id     F –> (E)    

如您所见,所有空产品都放在该符号的下一组下,而所有其余产品都在该符号的第一个下。

注意:对于LL(1)解析表,每种语法都不可行。一个单元可能包含一个以上的生产。

让我们看一个例子。

示例2:
考虑语法

S --> A | a
A --> a 

找到他们的第一个和跟随的集合:

  First Follow
S –> A/a { a } { $ }
A –>a { a } { $ }

解析表:

  a $
S S –> A, S –> a  
A A –> a  

在这里,我们可以看到同一单元中有两个产品。因此,该语法对于LL(1)解析器不可行。