【问题标题】:Finding an LL(1) grammar? [closed]找到一个 LL(1) 语法? [关闭]
【发布时间】:2013-12-02 02:28:26
【问题描述】:

如何找到该语言的 LL(1) 语法:

L=am bn cm+n

其中 m 和 n 是自然元素的元素?我的上下文无关语法是:

S → AB

A → acA |交流

B → bcB |公元前

谁能告诉我我是否走在正确的轨道上?

编辑:我的新 CFG 是

S → aSc |乙

B → bBc |公元前

但是我认为我可能对 LL(1) 有一个错误,因为 B 的两个推导都以 b 开头..正确吗?

编辑 谢谢,我想我明白了:

S → aSc |乙

B → bBc | λ

【问题讨论】:

  • 似乎更适合Computer Science
  • 另外,你没有走在正确的轨道上。您的 CFG 可以生成 acbc,它不属于 L

标签: context-free-grammar ll


【解决方案1】:

你的语法有两个主要问题:

  1. 您目前可以生成一些不是该语言的字符串。例如,您的语法可以生成 acacbcbc,而该语言不在该语言中。

  2. 您的语法不是 LL(1),因为您有许多 FIRST/FIRST 冲突。例如,产生式 A → acA 和 A → ac 都以 a 开头,因此给定非终结符 A 和字符 a,您无法确定应用哪个产生式。

作为提示,您的语言中的字符串正是 ambncnc 形式的字符串米。也就是说,试试看能不能在前面生成 m a,在后面生成 m c,然后切换生成 n b 和 n c 匹配。您可能想先尝试为 amcm 找到一个语法,看看是否可以调整它。

EDIT 为新语法:这看起来好多了!但是,您的作品中仍然存在 FIRST/FIRST 冲突

B → bBc

B→bc

此外,您的语法无法生成字符串 ac 或 ε。您应该能够通过修复 FIRST/FIRST 冲突来解决这两个问题。作为提示:如何将第二个产生式替换为不生成字符的产生式?

希望这会有所帮助!

【讨论】:

  • @user2914067- 我已经更新了我的答案以解决您的新语法问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多