2016-12-13 8 views
0

contents에 설명되어 있습니다 :"starred_list"와 "starred_expression"사이의 EBNF 규칙의 차이점은 무엇입니까? 여기

starred_list  ::= starred_item ("," starred_item)* [","]    
starred_expression ::= expression | (starred_item ",")* [starred_item] 

나는 그들이 동등한 규칙없는, 그들 사이의 차이를 말할 수 있습니까?

+0

: 다른 리터럴 구문에서

parenth_form ::= "(" [starred_expression] ")" 

을, 우리는 여분의 대안을 포함하지 않는, starred_list를 참조하십시오. .. 아니, 왜냐하면'starred_list' 프로덕션은 직접'expression'을 포함하지 않기 때문입니다 ... –

+0

'starred_item :: = expression | "*"or_expr'은'starred_list'에'expression'을 제공합니다. –

+0

그러나 선택적 쉼표는 처리하지 않습니다. –

답변

1

인용 된 문법은 실제 문법과 동일하지 않습니다 (두 문체가 동일한 효과를 나타 내기를 기대하지만). 참조 설명서의 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) "}" 
+0

@wowyoo : 내가 대답 한 바에 따르면, 그것들은 문법적으로는 동일하지만 의미 적 차이를 가지고 있습니다. 그것은 두 번째 단락의 첫 번째 문장이 말하는 것입니다. – rici

+0

나는 더 많은 시간을 문서를 공부하는 데 시간을 할애해야합니다. 도움을 청합니다. –

+0

구문 적으로 다른 구문을 대체 할 수 있다면 왜 우리는 두 가지가 필요합니까? 하나의 규칙만으로 충분합니다. –