【问题标题】:Generating the LL(1) parsing table for the given CFG为给定的 CFG 生成 LL(1) 解析表
【发布时间】:2015-12-19 19:01:30
【问题描述】:

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' 为了进一步进行。有人可以帮忙或建议吗?

【问题讨论】:

  • 您无法使用 left-factoring 解决此问题。但是,如果您分析结构,您会发现它等同于 S -> S'S

标签: parsing context-free-grammar ll


【解决方案1】:

您不能以这种方式将此语法转换为 LL(1) 解析器:语法是 left recursive,因此您必须执行 left recursion removal。关键是您可以执行以下技巧:由于S 的唯一规则是S -> SS'S -> (epsilon),这意味着您只需颠倒顺序,从而引入规则S -> S'S。所以现在的语法是:

S -> S'S
S'-> D|B
B -> b|c
D -> a|dB

现在我们可以构造firstfirst(B)={b,c}, first(D)={a,d}, first(S')={a,b,c,d}first(S)={a,b,c,d}

【讨论】:

  • 谢谢,但我有一个疑问:
  • @alisa:请[edit]你的问题。
  • 感谢您的回复。我有个疑问。正如您提到的“关键是您可以执行以下技巧:由于 S 的唯一规则是 S -> SS' 和 S -> (epsilon),这意味着您只需颠倒顺序,从而引入规则 S -> S'S。”您能否也详细说明一下? S->(epsilon) 也不是原始给定语法中的产生式,怎么可能添加它?请指教。
  • @alisa:大多数语法都隐含着这条规则:否则你的S 会生成无限量的S'es。
猜你喜欢
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
相关资源
最近更新 更多