BNF语法中竖线(|)的“或”规则应用疑问——以Python字符串文法为例
关于BNF中竖线(|)的“或”逻辑解释
你对BNF里竖线的理解存在偏差:竖线代表的是单个元素的可选类型,而非整个序列只能二选一。
拿你贴的Python字符串文法举例:
shortstringitem ::= shortstringchar | stringescapeseq shortstring ::= "'" shortstringitem* "'" | '"' shortstringitem* '"'
这里的shortstringitem*表示「零个或多个shortstringitem」,而每个shortstringitem都可以独立选择是shortstringchar还是stringescapeseq——完全允许在同一个字符串里混合两种类型的元素。
比如Python字符串'hello\\nworld',对应的文法解析逻辑是:
- 开头的
' - 依次是
h(shortstringchar)、e(shortstringchar)、l(shortstringchar)、l(shortstringchar)、o(shortstringchar)、\\n(stringescapeseq)、w(shortstringchar)、o(shortstringchar)、r(shortstringchar)、l(shortstringchar)、d(shortstringchar) - 结尾的
'
这个例子完全符合文法定义,因为每个独立的shortstringitem都选了对应的合法类型,竖线只是给单个元素提供选项,并非限制整个序列只能用同一种元素。
简单说:BNF里的|是「单个元素的可选分支」,不是「整个序列的排他选择」,只要序列里的每个元素都符合其中一个选项即可,不同元素可以选不同分支。
内容的提问来源于stack exchange,提问作者user21488634
相关产品推荐
相关产品推荐

