parsing - LL(1) 文法可以有多个以相同非终结符开头的规则吗?

标签 parsing grammar context-free-grammar ll-grammar

给定语法 G 定义

A -> Ca
B -> Cb
C -> e|f

这个文法是LL(1)吗?

我意识到我们可以将其压缩为一行,但这不是这个问题的重点。

主要是,LL(1) 语法可以有多个以相同非终结符开头的规则吗?

作为后续问题,如何为上述语法构建解析表?

我已经解决了以下问题:

FIRST(A) = {e,f}
FIRST(B) = {e,f}
FIRST(C) = {a,b}

FOLLOW(A) = {}
FOLLOW(B) = {}
FOLLOW(C) = {a,b}

我查看了this post ,但不明白他们是如何从 FIRST 和 FOLLOW 发展到餐 table 的。

最佳答案

您给出的语法不是 LL(1),因为两个产生式 A → Ca 和 A → Cb 之间存在 FIRST/FIRST 冲突。

一般来说,以相同非终结符开头的相同非终结符的多个产生式的语法不会是 LL(1),因为您会遇到 FIRST/FIRST 冲突。有些具有此属性的语法是 LL(1),尽管它们本质上是退化的情况。例如,考虑以下语法:

A → Ea

A → Eb

E → ε

这里,非终结符 E 仅扩展为空字符串 ε,因此实际上并不存在。因此,上面的语法是 LL(1),因为两个产生式之间不存在 FIRST/FIRST 冲突。要看到这一点,这是解析表:

     a  b  $
A    Ea Eb -
E    ε  ε  -

希望这有帮助!

关于parsing - LL(1) 文法可以有多个以相同非终结符开头的规则吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21710238/

相关文章:

sql - 是否有任何用于配置单元的 SQL 查询解析器?

date - Jodatime:从日期获取毫秒结果为 "Illegal instant"

javascript - 使用 java 和 javascript 将数据从 Excel 导入数据库。更快的方法是什么?

math - 使用上下文无关语言抽取引理

ios - 使用 Swift 发布 JSON

parsing - POSIX sh EBNF 语法

java - 如何为嵌套的 "if"指令定义使用多个破折号的语法?

parsing - 转移/减少 Bison 的冲突

antlr - 如何删除 ANTLR3 警告 'multiple alternatives'

compiler-construction - Jison:二元运算语法冲突