我似乎不能完全理解“或”在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.
无需深入研究示例...不幸的是,这不能回答我的问题。
一个
shortstringitem
只能是一个或另一个。但是一个shortstring
可以由多个shortstringitem
组成,每一个都是独立“展开”的。
考虑
'x\n'
,例如,您可以将其解析为
'x\n' -> stringliteral
-> shortstring
-> "'" shortstringitem shortstringitem "'"
-> "'" shortstringchar stringescapeseq "'"
-> "'" 'x' '\' 'n' "'"
第一个
shortstringitem
被识别为shortstringchar
,第二个被识别为stringescapeseq
。