BNF语法中的“或”、(|)

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

我似乎不能完全理解“或”在BNF语法中的应用,用竖线符号(|)表示。让我感到困惑的一个很好的例子是 The Python Language Reference 中对字符串文字的描述。 (我删除了与问题无关的部分描述):

stringliteral   ::=  [stringprefix](shortstring | longstring)
shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
shortstringitem ::=  shortstringchar | stringescapeseq
shortstringchar ::=  <any source character except "\" or newline or the quote>
stringescapeseq ::=  "\" <any source character>

所以,我对

<shortstringitem>
的描述的理解是,它可以是
<shortstringchar>
OR
<stringecapeseq>
。这是否意味着它不能同时存在?如果我没记错的话,一个字符串可能同时包含两者......(为了清楚起见
<shortstingchar>
据我所知这是我的字符串的文本)

谢谢。

搜索网络,包括 stackoverflow 并观看了解释性视频,但似乎都用类似的东西来描述“或”:

<letter> ::= A|B|C|D|E...Y|Z. 

无需深入研究示例...不幸的是,这不能回答我的问题。

python bnf
1个回答
3
投票

一个

shortstringitem
只能是一个或另一个。但是一个
shortstring
可以由多个
shortstringitem
组成,每一个都是独立“展开”的。

考虑

'x\n'
,例如,您可以将其解析为

'x\n' -> stringliteral
      -> shortstring
      -> "'"  shortstringitem shortstringitem "'"
      -> "'" shortstringchar stringescapeseq "'"
      -> "'" 'x' '\' 'n' "'"

第一个

shortstringitem
被识别为
shortstringchar
,第二个被识别为
stringescapeseq

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.