ISO 5234 说:
https://datatracker.ietf.org/doc/html/rfc5234#section-3.2
由正斜杠(“/”)分隔的元素是替代元素。因此,
foo / bar
将接受
或 。
使用 ISO 3339 作为 ISO 8601 日期时间的 ABNF 定义,您会得到如下行
https://datatracker.ietf.org/doc/html/rfc3339#appendix-A
date-century = 2DIGIT
date-decade = DIGIT ; 0-9
date-subdecade = DIGIT ; 0-9
date-year = date-decade date-subdecade
dateopt-century = "-" / date-century
datespec-year = date-century / dateopt-century date-year
如果您假设替代项意味着首先匹配,则
2024
只会匹配 20
并忽略其余部分。如果您假设替代项意味着最长匹配,则 2024
将完全匹配。
基于此,似乎几乎可以安全地假设替代方案确实是最长的匹配。这是正确的吗?
ABNF 中的替代运算符是第一个匹配还是最长的?
都不是。
BNF 及其变体指定上下文无关语法。与解析表达式语法不同,上下文无关语法没有有序选择的概念。选项之间没有优先级,您可以选择能够成功解析的选项。
假设您有以下产品:
start = foo bar
foo = "A" / "AB"
bar = "C" / "BD"
如果我们采用“匹配优先”策略,则输入“ABBD”将不会被接受,因为
foo
只会匹配“A”,而剩下的“BBD”无法与bar
匹配。这就是 PEG 会发生的情况,但对于 CFG,“ABBD”是上述语法定义的语言中的一个单词。
如果我们采用“最长匹配”策略,则输入“ABD”将不会被接受,因为
foo
将匹配“AB”,留下一个无法与 bar
匹配的“D”。但同样,“ABD”是语言的一部分,所以我们也不能使用该策略。
上下文无关语法的规则是,如果存在任何可以从语法中派生出该单词的派生序列,则该单词就是该语言的一部分,并且您可以选择哪些替代方案来提出这样的单词,并且没有任何限制。顺序。