先决条件–自上而下的解析器的分类,第一个集合,第二个集合
自上而下的解析器从开始非终端开始,自上而下地构建解析树。自上而下的解析器有两种类型:
- 具有回溯功能的自上而下的解析器
- 自上而下的解析器,无回溯
没有回溯的自上而下的解析器可以进一步分为两部分:
在本文中,我们将讨论非递归下降,也称为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)解析器不可行。