Bjarne 的编程书中的列表语法示例有误吗?

Mistake in list grammar example in Bjarne's programming book?

此刻我正在阅读 Bjarne Stroustrups 的书 'Programming Principles and Practice using C++' 的第 6.4.2 段。在本段中,他演示了以下列表语法:

List:
    "{" Sequence "}"
Sequence:
    Element
    Element "," Sequence
Element:
    "A"
    "B"

他说根据上面的语法,下面是List:

{ A }
{ B }
{ A,B }
{A,A,A,A,B }

Element "," Sequence 不应该是 Sequence "," Element 以使 { A,B }{A,A,A,A,B } 根据此语法正确列表吗?

我怎么理解这个语法,A是一个Sequence。这使得 B 成为 Element,对吧?

左右递归是等价的,最后所有出现的Sequence都必须替换为Element,顺序无关紧要。

{ A , B }:

  • 列表
  • { 序列 }
  • { 元素 , 序列 }
  • { 元素 , 元素 }
  • {甲,乙}

{ A , A , A , A , B }:

  • 列表
  • { 顺序 }
  • { 元素 , 序列 }
  • { 元素 , 元素 , 序列 }
  • { 元素 , 元素 , 元素 , 序列 }
  • { 元素 , 元素 , 元素 , 元素 , 序列 }
  • { 元素 , 元素 , 元素 , 元素 , 元素 }
  • { A , A , A , A , B }

因此,两者都可以从语法中生成,因此都是正确的列表。

Element "," SequenceSequence "," Element 在这里是等价的。

AB都是Element

Element:
    "A"
    "B"

但是每个 Element 也是有效的 Sequence:

Sequence:
    Element

基本上,

Sequence:
  Element "," Sequence

表示"if you have an element, a comma, and a sequence, that forms another sequence"。 IE。此规则允许您在序列的开头添加元素以扩展它。

Sequence:
  Sequence "," Element

表示"if you have a sequence, a comma, and an element, that forms another sequence"。此规则允许您在序列末尾添加元素以扩展它。

无论哪种情况,最终结果都是(逗号分隔)元素列表。

List {A,A,A,A,B} 中,A,A,A,A,B 是一个 Sequence.

这进一步分解为 AA,A,A,B,其中 A 元素 (很方便,因为它是单个 terminal),A,A,A,B 是一个 Sequence。这一直持续到您到达构成序列的两个单一终端,它们都是元素。