grammar - 这种上下文无关的语法是明确的吗?
问题描述
我想知道我想出的语法是否明确。
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 是产生式集合。
解决方案
这种语法是明确的,也是不确定的。当对于至少一个有效的输入字符串存在多于一个语法树时,语法是不明确的,并且是确定性的,如果对于每个有效的输入字符串,在解析期间的任何时间,都只有一个要使用的预测。对于无效的输入字符串,会有一段时间没有预测可以使用。
预测M → S + S
,M → S - S
并使M → S
语法具有不确定性,因为S
是它们每个的第一个非终结符号。但是,在解析所有输入之后,这不会导致任何输入的多于一个语法树,因为S
are +
、-
(in M
) 和非终结符in)
之后的终结符号将一致地确定哪个预测是有效的。M
S → ( 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] ")"
推荐阅读
- docker - 如何修复 Docker Build 生成的容器中的时区
- embedded - 在嵌入式系统中使用六边形架构
- react-native - NativeModule RNCGeolocation 为空
- google-cloud-platform - Google Vision API 可以提取图片中对应文字的多语言代码吗
- c++ - 从数组中删除奇数
- javascript - 如何在外部 json 文件上为 Vue js 上的 Web 应用程序最终构建创建 require 函数?
- javascript - 在 Angular 6 项目中,@brief 是什么意思?
- search - 我正在尝试使用 Vimscript 中的 search() 函数搜索字符串
- delphi - 我什么时候应该使用 VirtualTree 的 BeginSynch 和 BeginUpdate?
- python - 如何重复一个函数并使其每次在变量中重新运行而不复制和粘贴?