2013-01-05 4 views
1

중괄호 인용구 내에서 왜 모두 중괄호 (중첩에 포함되지 않아야 함)를 이스케이프 처리해야하지만 대괄호 대체 안에는 모든 괄호 (그 중첩에 포함되어서는 안됨)를 피할 수 있습니다. 인터프리터는 단어의 시작 부분에 {을 발견하면 일치하는 } 단어를 (명령 이름은 실행하거나 인수 중 하나가 명령을 보낼 수) 도착하는중첩 된 {}과 [] 사이의 차이

puts "}" ;# ok in top-level (1) 
if {1} {puts "}"} ;# but not ok when inside a brace quote (2) 

puts {]} ;# ok in top-level (3) 
set output [puts {]}] ;# and still ok inside a bracket substitution (4) 

답변

4

, 그것은 보인다.

그러나 인터프리터에서 이스케이프 처리되지 않은 [이 발생하면 ]과 일치하지 않습니다. 스크립트 자체의 구문 분석을 중지하고 다른 인터프리터를 재귀 적으로 호출합니다. 그 해석기는 [ 다음의 문자를 해석하기 시작합니다. 예제 4에서 {을 찾으면 인용 모드를 시작하므로 ]은 일반 문자처럼 취급됩니다.

그렇다면 {이 발생했을 때 재귀 적으로 인터프리터를 호출하지 말고 예제 2에서 중괄호 문제를 제거하십시오. 당신이 중괄호를 사용하여 인용 한 단어가 항상 스크립트가 아니기 때문에, 아마 그것이 곧 실행되지 않을 것입니다. 중괄호 인용은 정확해야합니다. 파서는 ", [] 등 ... 내부에 있는지 여부에 따라 문자를 다르게 처리 할 수 ​​없습니다. 예를 들어 스크립트 파서가 그렇듯이.

+1

구현 수준에서 우리는 언어 파서의'[''...']'시퀀스를 구문 분석하고 명령 컴파일러에 따라'{'...'}'시퀀스를 파싱 할 것인지 결정합니다. –