【问题标题】:Is this context-free grammar unambiguous?这种上下文无关的语法是明确的吗?
【发布时间】:2021-01-26 03:34:21
【问题描述】:

我想知道我想出的语法是否明确。

G(N, T, P, S)

N = {S, M}
T = {+, -, (, ), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
P = {
S → 0, S → 1, … , S → 9
S → ( M )
M → S + S
M → S - S
M → S
}

S 是起始变量,N 是非终结符集合,T 是终结符集合,P 是产生式集合。

【问题讨论】:

  • 它没有歧义,因为它要求表达式被完全括起来。但是请注意,它不能识别包含多于一位的数字,这可能被视为缺陷。

标签: grammar theory context-free-grammar


【解决方案1】:

这个语法是明确的,也是不确定的。对于至少一个有效的输入字符串,当存在多于一个语法树时,语法是不明确的;如果对于每个有效的输入字符串,在任何时间,语法都是确定性的。解析时,只有一个预测可以使用。对于无效的输入字符串,会有一段时间没有预测可以使用。

预测 M → S + SM → S - SM → S 使语法具有不确定性,因为 S 是它们每个的第一个非终结符。但是,在解析所有输入之后,这不会导致任何输入的语法树超过一个,因为S 之后的终端符号是+-(在M 中)和)S → ( M )中的非终结符M之后会一致判断哪个预测是有效的。

这个语法可以用 ABNF 标准语法写成这样:

S = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" / "(" M ")"
M = S "+" S / S "-" S / S

左重构后,语法可以成为确定性的(不会改变歧义,即语法仍然是明确的):

S = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" / "(" M ")"
M = S [("+" / "-") S]

并且使用较短的 ABNF 范围语法:

S = %x30-39 / "(" M ")"
M = S [("+" / "-") S]

或者用一个带有自动机的单线:

S = %x30-39 / "(" S [("+" / "-") S] ")"

【讨论】:

  • 语法当然是确定性的。它只是不是 LL(k)。如果将其输入 LR(1) 算法,则会生成一个确定性解析器。
  • 不,语法是不确定的,因为M → S + SM → S - SM → S都以S开头,这意味着S中所有可到达的终端符号在由 LL 解析器/确定性下推自动机使用。
  • 语法实际上也是 LL(2),因为在 M 中从 S 消耗了第一个终端符号之后,有效输入的下一个符号将是 +、@987654346 @ 或 ),这使它成为 LL(2),因为需要两个符号来消除 M 的有效替代项的歧义。
  • DPDA 和 LL 解析器不是同义词。不是每个 DCFL 都是 LL(k)
  • S 可以以任意数量的开放括号开头,所以我认为 LL(k) 是不可能的。
猜你喜欢
  • 2018-07-13
  • 1970-01-01
  • 2015-04-25
  • 2019-04-12
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2014-04-26
  • 2016-03-18
相关资源
最近更新 更多