인용 된 문법은 실제 문법과 동일하지 않습니다 (두 문체가 동일한 효과를 나타 내기를 기대하지만). 참조 설명서의 Chapter 10에 실제로 CPython 구문 분석기를 생성하는 데 사용 된 문법을 볼 수 있습니다. 두 문법은 비 터미널의 이름에서만 다른 것이 아니므로 어떤 소스 코드 프로덕션이 인용 된 규칙과 일치하는지 완전히 알 수는 없습니다.
넓은 의미에서 인용 된 두 저작의 차이는 구문 론적이 아니라 의미 론적 의미입니다. 두 작품 모두 정확히 동일한 유효 문장 세트를 산출합니다. 의미상의 차이점은 마침표가없는 별표가없는 단일 표현식을 처리하는 것입니다. 첫 번째 대안 :
starred_expression ::= expression | (starred_item ",")* [starred_item]
는 또한 starred_item
의 첫번째 대안을 이용하여, 제로 (starred_item ",")
의 반복 후 단일 starred_item
일치시킴으로써, 2 대안에서 expresion
를 도출 할 수있을 것이다. 두 대안은 서로 다른 의미를 가지고 있기 때문에 그러나, 분명히 중복 교대가 지정됩니다
(x)
간단한 괄호 표현을
(x ,)
반면은 하나의 요소 튜플이다. 이 구분은 표현식 목록이 괄호로 묶여있는 경우에만 필요합니다. 대괄호 또는 중괄호로 묶인 경우 두 경우 사이에 의미 적 구분이 없습니다. [ x ]
은 의미 상으로 [ x , ]
과 동일하고 마찬가지로 { x }
및 { x , }
과 동일합니다. 이것은 문법에 반영됩니다. 괄호 표현식 또는 튜플 중 하나를 생산할 수있는 생산, starred_expression
가 사용됩니다
list_display ::= "[" [starred_list | comprehension] "]"
set_display ::= "{" (starred_list | comprehension) "}"
: 다른 리터럴 구문에서
을, 우리는 여분의 대안을 포함하지 않는,
starred_list
를 참조하십시오. .. 아니, 왜냐하면'starred_list' 프로덕션은 직접'expression'을 포함하지 않기 때문입니다 ... –'starred_item :: = expression | "*"or_expr'은'starred_list'에'expression'을 제공합니다. –
그러나 선택적 쉼표는 처리하지 않습니다. –