3

제가 사용 해본 대부분의 언어는 재귀 적 주석을 지원하지 않습니다.재귀 주석에 대한 언어 지원

  1. 언어 설계자가 이것을 구현하지 않는 이유는 무엇입니까?
  2. 현혹 복잡합니까?
  3. 원하지 않는 결과가 있습니까? 재귀 주석의

예 :

/* 
for (int j = 0; j <= SourceTexture.Height; j += SampleSize) 
{ 
    ... 
} 

// Comment within comment below: 
/*for (int i = 0; i < TextureColour.Length; i++) 
{ 
    ... 
}*/ 


sourceTexture.SetData<Color>(TextureColour); 
*/ 

편집 : 나는 지금까지 (당신은 문자열의 주석 토큰이있을 때 문제가 발생)에 대한 답변의 인수를 이해합니다. 그러나, 내 혼란에 대한 이유는 지금 당신이 그 문제가있다.

예를 들어, 아래 코드는 예상 된 결과를 제공하지 않는다는 것을 알고 있습니다. 또한 예기치/원치 않는 결과를 얻을 것이다

/* 
CODE "*/"; 
*/ 

:

/* 
    char *str = "/* string"; 
    // Are we now 1 level inside a comment or 2 levels? 

*/ 

printf("Hello world"); 

/* 
    char *str2 = "string */"; 
*/ 

그러나 아래의 경우 예기치 않은 결과와 다를 바없는 내 마음에

.

그래서 재귀 주석에 문제가 될 수 있지만, 왜 그렇게하지 않을 이유가 아닌지에 대한 내 주장은 비 재귀 주석에 대해서는 이미 문제가 있다는 것입니다. 프로그래머로서 나는 컴파일러가 이와 같이 행동하고 그것을 해결한다고 알고있다. 나는 반복적 인 주석으로 같은 문제를 해결하는 것이 훨씬 더 많은 노력이라고 생각하지 않는다.

+0

왜 컴파일러에 대한 소개 텍스트를 읽지 않으신 후 다시 오시겠습니까? – Marcin

+0

나는 컴파일러의 기초를 이해하지만, 실제로는 기본 (이 질문)만을 이해한다. 미안하지만 단순한/명백해야합니다. –

+0

+1 나는 항상 이것을 싫어하기 때문에.현대 편집자라면 더 이상 문제가되지 않습니다. (Visual Studio에서^KC 할 수 있고 텍스트 블록은 // 주석 처리됩니다.) – xanatos

답변

2

언어 디자이너가 을 구현하지 않는 이유는 무엇입니까?

이것은 어휘 분석을 구현하기 어렵게 만듭니다.

현혹 복잡합니까?

IMHO, 아니요,하지만 주관적입니다.

원하지 않는 결과가 있습니까?

말하기 어렵다. 이미도 일반 블록 주석 문제를 만들 수 있다는 것을 발견했다 : HaskellFrege :

/* print ("*/"); */ 

나는 중첩 블록 의견이 두 언어를 알고있다.

2

나는 예를 만들 것입니다 아마도 그것은 명확하게됩니다

/* 
    char *str = "/* string"; 
    // Are we now 1 level inside a comment or 2 levels?  
*/ 

printf("Hello world. Will this be printed? Or is it a comment?"); 

/* 
    char *str2 = "string */"; 
*/ 

당신은 코멘트 안에 무엇을 해석하지 않고 코멘트 내부 의견을 구문 분석 할 수 없습니다. 그러나 코멘트가 있기 때문에 주석 내부에있는 것을 해석 할 수 없으므로 정의에 따르면 "언어"가 아닌 "인간 텍스트"입니다.

+0

이것에 대해 확장하자면, 이것은 전체 파일 (또는 다른 파일)을 스캔 한 후에 결정할 수있다. 입력 단위). 그러나 훨씬 복잡한 어휘 검색이 필요합니다. – Marcin

+0

@Marcin 다른 주석에서 문자열 안에'* /'기호를 사용할 수 있습니다 ... 복잡해질 것이라고 생각합니다. – xanatos

+0

@Marcin 편집 한 코드 샘플을 어떻게 파싱 하시겠습니까? :-) – xanatos

0

나는 처음부터 생각해 본적이 없다고 생각하며, 사물이 발전함에 따라 "중요하지 않은"기능 추가가됩니다. 또한 훨씬 더 많은 검증이 필요합니다.

시나리오 예 ...

MyLang 버전 1 : 목적

개발자를 주석 멀티 라인을 제공 : 흠 .. 나도 알아, 때마다 내가 찾기 /* 나는 다음까지 모든 것을 주석으로 달 것입니다 */ - 쉬워요!

MyLang 버전

일일 나중에 일 개 출시 ...

사용자 : 음 ...나는 반복적 인 코멘트를 할 수 없다, 도와주세요.

지원 : 기다려주십시오.

30 분 후에 ...

지원 관리자 -> 개발자 : 사용자가 재귀 코멘트를 할 수 없습니다.

개발자 : (재귀 무엇 ...) 잠시만 ...

30 분 이후

개발자 : 그래, 우리는 재귀 지원 주석 해달라고.

1

C의 여러 줄 주석은 중첩 될 수 없지만 #if 0 ... #endif을 사용하여 C에서 재귀 주석의 영향을 더 많이 또는 줄일 수 있습니다 (코드 블록을 비활성화하려는 경우 사용하는 것이 좋습니다. , 바로 그 이유로).

게시물처럼 바보처럼 설계된 C 사전 처리기조차도 중첩 된 주석을 처리 할 수 ​​있습니다. 거짓 조건이있는 중첩 된 #if 지시문을 처리 할 수 ​​있어야하기 때문입니다. 따라서 주석을 더 복잡하게 만들지 만 전처리에서 수행 된 다른 작업보다 더 복잡하지 않으므로 정의하거나 파싱하기 어려운 것은 아닙니다.

그러나 #if 0 ... #endif을 사용하면 제외하려는 코드에 일치하지 않는 #endif이 없어야합니다.

근본적인 주석은 (a) 완전히 구조화되지 않았고 (b) 재귀 적이 될 수 없습니다. 우연히 또는 고의적 인 선택에 의해 C는 (a) - 주석 된 텍스트는 주석 종료 자 시퀀스 (또는 *??/<newline>/과 같은 trigraph 등가물)를 포함하지 않는 것 이외의 구문 제약 조건을 따르지 않아도됩니다.