문제

저는 C로 장난감 프로그래밍 언어용 데모 컴파일러를 작성하고 있습니다.

프로그램 읽기와 어휘 분석 사이의 별도 단계에서 매크로 처리를 수행하면 어떤 문제가 발생할 수 있습니까?

도움이 되었습니까?

해결책

"전처리기"는 일반적으로 주 컴파일러가 코드를 확보하기 전에 코드를 변환하는 도구를 의미합니다.

이는 전처리기가 소스를 다음과 같이 렉싱(및 구문 분석)하는 것입니다. 그것은 규칙을 적용하고 일부 변환을 수행한 후 결과를 출력합니다.메인 컴파일러는 다음과 같이 전처리기의 작업 결과를 어휘화하고 구문 분석합니다. 그것은 규칙(전처리기에서 사용하는 규칙과 다를 수 있음)

따라서 전처리기가 프로그램 텍스트에 대해 사소한 변경을 수행하는 경우 최종 결과를 한눈에 예측하기 어려울 수 있습니다.이는 c-전처리기가 있는 c의 경우에도 마찬가지입니다. 그러나 (또는 ​​아마도 따라서) 규칙에 따르면 상당히 예측 가능한 결과를 얻을 수 있는 몇 가지 방식으로만 전처리기를 사용해야 합니다.(저는 c 전처리기가 튜링 완전하다고 믿습니다. 따라서 이를 디버깅하려고 미친 듯이 노력하지 않으면 얻을 수 있는 것에는 제한이 없습니다. Pavel의 의견을 생각해보면 루프, 재귀, 스택이 없다는 점을 인정합니다.그게 죽이는 것 같습니다.감사해요.충분히 발전된 매크로 더미를 디버그하려고 애쓰면서 여전히 미친 짓을 할 수 있습니다.)

다른 팁

위에서 언급했듯이 C 전 처리기는 언어의 제한으로 인해 기본 텍스트 변환 만 수행하므로 상당히 제한됩니다. 반면, Common LISP의 매크로 시스템을 살펴보면 매크로 시스템을 기본 언어에 통합하는 이점을 볼 수 있습니다. 매크로의 기본 언어 시설을 사용할 수 있기 때문입니다.

간단한 예

(defmacro ntimes (data n)
  `(loop for i from 1 to ,n collecting ,data))

(print (ntimes 'a 10))

Result : (A A A A A A A A A A)

이 변환은 컴파일 타임에 이루어질 것입니다 (소스의 좋은 것 중 하나는 자체 ast입니다). 이것은 분리 된 전처리 기가 할 수없는 것 (사전 프로세서에 컴파일러 사본이 포함되어 있지 않는 한!)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top