这个上下文无关语法是明确的吗?

问题描述

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

G(N,T,P,S)

N = {S,M}
T = {+,-,(,),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 是产生式的集合。

解决方法

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

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

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

S → ( M )

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

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

使用更短的 ABNF 范围语法:

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

或者带有一个单行,下面有它的自动机:

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

enter image description here