📜  LL(1)解析表的构造(1)

📅  最后修改于: 2023-12-03 15:32:43.820000             🧑  作者: Mango

LL(1)解析表的构造

LL(1)解析表是一种用于表示文法所对应的语法分析表,可以用于预测分析。其构造需要用到文法的FIRST集和FOLLOW集。

文法的FIRST集和FOLLOW集

文法的FIRST集是指对于一个非终结符号,它所能推导出的所有符号串中的第一个终结符号的集合。如果其推导出的所有符号串第一个符号是一个非终结符,则需要继续向后推导,直到找到一个终结符号。

文法的FOLLOW集是指对于一个非终结符号,它的后面所能跟随的终结符号的集合。要计算一个非终结符号的FOLLOW集,需要考虑它在其他非终结符号的后面出现的情况。

构造LL(1)解析表

LL(1)解析表的构造需要先计算文法的FIRST集和FOLLOW集。对于每个非终结符A,需要考虑以下情况:

  1. 如果文法中存在一个产生式A -> ε,则对文法中所有使用A的产生式B -> αAβ,将FIRST(β)加入到FOLLOW(A)中。
  2. 对于产生式A -> α,将FIRST(α)中的所有终结符加入到SELECT(A -> α)中。
  3. 对于文法中所有产生式A -> α,如果FIRST(α)中包含ε,则将FOLLOW(A)中的所有符号加入到SELECT(A -> α)中。

通过以上步骤计算出每个产生式的SELECT集合后,就可以构造出LL(1)解析表。LL(1)解析表是一个二维数组,行是非终结符,列是终结符。对于某个产生式A -> α,如果存在终结符a使得a在SELECT(A -> α)集合中,则在LL(1)解析表中填入A -> α,否则填入ERROR。

下面是一个示例文法和对应的LL(1)解析表:

文法:

S -> ( L ) | a
L -> L , S | S

FIRST集和FOLLOW集:

FIRST(S) = {(, a)}
FOLLOW(S) = {), $}
FIRST(L) = {(, a)}
FOLLOW(L) = {), $, ,}

LL(1)解析表:

|    | (     | )     | a     | ,     | $     |
|----|-------|-------|-------|-------|-------|
| S  | S -> ( L )  | ERROR | S -> a | ERROR | ERROR |
| L  | L -> S , L | L -> ε | S -> a | ERROR | ERROR |
|    | L -> S , L | ERROR | ERROR | L -> , S | ERROR |

以上就是LL(1)解析表的构造过程,它可以用于预测分析,对于任何一个输入串,都可以在LL(1)解析表中查找到所需的产生式,从而得到语法分析树。