ABNF 中的替代运算符是第一个还是最长的?

问题描述 投票:0回答:1

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
将完全匹配。

基于此,似乎几乎可以安全地假设替代方案确实是最长的匹配。这是正确的吗?

grammar iso peg abnf
1个回答
0
投票

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”是语言的一部分,所以我们也不能使用该策略。

上下文无关语法的规则是,如果存在任何可以从语法中派生出该单词的派生序列,则该单词就是该语言的一部分,并且您可以选择哪些替代方案来提出这样的单词,并且没有任何限制。顺序。

© www.soinside.com 2019 - 2024. All rights reserved.