【问题标题】:LL parser grammarLL 解析器文法
【发布时间】:2014-10-22 02:13:08
【问题描述】:

我在下面有这个语法并试图弄清楚是否可以使用 LL 解析器进行解析?如果不是,请解释。

S --> ab | cB
A --> b | Bb
B --> aAb | cC
C --> cA | Aba

据我了解,两组的交集必须为空才能通过成对不相交测试。

但我不知道从哪里开始,并且一直在查看我的教科书和http://en.wikipedia.org/wiki/LL_parser#Parsing_procedure,但不能完全理解或找到任何可以遵循的示例。我只需要查看程序或步骤即可了解如何解决其他类似问题。任何帮助表示赞赏。

【问题讨论】:

  • 如果存在左递归,LL(k)解析器无法解析。
  • @Mephy:不幸的是,反过来不成立——即使没有左递归,它也可能不是 LL(k)

标签: parsing grammar ll


【解决方案1】:

计算所有非终结符的 FIRST 集,并检查给定非终结符的替代项的 FIRST 集是否都是不相交的。如果全部是,则为 LL,如果有任何非终结符不是它们,则不是。如果有任何 ε 规则,您还需要 FOLLOW 集。

计算 FIRST1 集非常简单,它会告诉你语法是否为 LL(1)。计算 FIRSTk 集要复杂得多,但会告诉您对于您计算 FIRSTk 集的任何特定 k,语法是否为 LL(k)。

【讨论】:

  • B 的第一个集合也是 {a,c},C 是 {c,b,a},A 是 {b,a,c}。我这样做对吗?那么现在 S 会是什么?
  • @JessicaDinh 是的,看起来您正确计算了 A、B 和 C 的第一组。并且因为它们不是不相交的,所以语法不是 LL1 可解析的。现在您可以继续为较大的 K 生成 FIRST 集,直到找到合适的 K 或放弃。您是否必须确定任何 K 的语法是 LL(1) 还是 LL(K)?
猜你喜欢
  • 1970-01-01
  • 2021-01-03
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多