为给定的 CFG 生成 LL(1) 解析 table
Generating the LL(1) parsing table for the given CFG
CFG如下:
S -> SD|SB
B -> b|c
D -> a|dB
我试过的方法如下:
我通过左分解法从第一个产品 (S->SD|SB
) 中移除了不确定性。
所以,左分解后的CFG如下:
S -> SS'
S'-> D|B
B -> b|c
D -> a|dB
我需要找到 S
的 第一个 用于制作,即 S -> SS'
以便进一步进行。有人可以帮忙或建议吗?
您不能以这种方式将此语法转换为 LL(1) 解析器:语法是 left recursive, you thus will have to perform left recursion removal。关键是您可以执行以下技巧:由于 S
的唯一规则是 S -> SS'
和 S ->
(epsilon),这意味着您只需颠倒顺序,从而引入规则 S -> S'S
。所以现在的语法是:
S -> S'S
S'-> D|B
B -> b|c
D -> a|dB
现在我们可以构建first: first(B)={b,c}, first(D )={a,d}, first(S')={a,b,c,d} 和 first(S)={ a,b,c,d}.
CFG如下:
S -> SD|SB
B -> b|c
D -> a|dB
我试过的方法如下:
我通过左分解法从第一个产品 (S->SD|SB
) 中移除了不确定性。
所以,左分解后的CFG如下:
S -> SS'
S'-> D|B
B -> b|c
D -> a|dB
我需要找到 S
的 第一个 用于制作,即 S -> SS'
以便进一步进行。有人可以帮忙或建议吗?
您不能以这种方式将此语法转换为 LL(1) 解析器:语法是 left recursive, you thus will have to perform left recursion removal。关键是您可以执行以下技巧:由于 S
的唯一规则是 S -> SS'
和 S ->
(epsilon),这意味着您只需颠倒顺序,从而引入规则 S -> S'S
。所以现在的语法是:
S -> S'S
S'-> D|B
B -> b|c
D -> a|dB
现在我们可以构建first: first(B)={b,c}, first(D )={a,d}, first(S')={a,b,c,d} 和 first(S)={ a,b,c,d}.