Language/C2011.03.17 13:35

컴파일은 5단계의 작업을 거친다. 진행 단계에 따라 에러가 발생할 수 있다. 에러가 발생하면 컴파일러가 무슨 에러가 발생 했는지 알려준다. 알려주는 에러를 잘 보고 어디서 에러가 발생했는지 분석하여 수정할 수 있어야 한다. 따라서 에러를 유발하여 어떤 단계에서 에러가 발생하였는지 예제를 통해 간단히 알아보자.


★ 소스

#nclude <stdio.h>

int main()
{
printf("1000\n");
printf("%o\n",1000); // 8진수
printf("%x\n",1000); // 16진수

return 0;
}


소스의 첫 줄에 #include 에 i 를 빼고 컴파일 해보자. 분명히 에러가 발생할 것이다.
과연 무슨 에러가 발생할까??



★ 실행 결과


 


★ 설명
 

main3.c : 1~2번째 줄 : 지시자 #nclude는 전처리 중 무효하다.

이러한 에러는 전처리 과정에서 발생한 사실을 알 수 있다. 컴파일러가 전처리에서 에러가 발생했다고 친절히 알려준다. 단지 영어로 알려준다. 



★ 소스

#include <stdio.h>

nt main()
{
printf("1000\n");
printf("%o\n",1000);   // 8진수
printf("%x\n",1000);   // 16진수

return 0;
}


int main() 에 int의 i를 삭제하고 컴파일 해보자.



★ 실행 결과

 


★ 설명
 

main3.c : 3번째 줄 : 에러 : ”main” 전에 구문 분석(parse) 에러가 발생했다.


C 컴파일에서 구문 분석에서 에러가 발생한 것을 알 수 있다. C 컴파일 과정에도 세부적인 단계를 따지면 6 단계 정도로 나눌 수 있다. 

1. 어휘 분석 (Lexical Analysis)
2. 구문 분석 (Systax Analysis)
3. 의미 분석 (Smantic Analysis)
4. 중간 코드 생성 (Intermediate Code Generation)
5. 코드 최적화 (Code Otimization)
6. 목적 코드 생성 (Code Generation)


6 단계 중에 2. 구문 분석에서 에러가 발생한 것이다. 



★ 소스


#include <stdio.h>
int main)
{
printf("1000\n");
printf("%o\n",1000); // 8진수
printf("%x\n",1000); // 16진수

return 0;
}

int main()에서 ( 괄호를 제거 해보자.


★ 실행 결과





★ 설명
 


많은 에러가 발생한다. 이런 에러를 보면 당황할 수 있지만 우선 가장 처음 에러가 발생한 부분을 살펴 보자.

main3.c : 3 번째 줄 : 에러 : ‘)’ 토큰 이전 부분에 구문 분석(parse) 에러가 발생했다.

int main()에서 ( 괄호를 제거를 했을 뿐이지만 에러는 엄청나다. 머리가 지끈지끈 아파올지도 모른다. 이럴 경우 처음 발생한 에러 부분 부터 해결을 해보자. 처음 발생한 에러에 의해 뒷 부분까지 영향을 미치는 경우가 있다. 에러 하나를 해결하면 모두 해결될 수 있다. 위와 같은 경우가 그렇지 않은가??
여기서도 에러는 C 컴파일 과정 중에 발생했다. 구문 분석 에러가 발생했기 때문에 알 수 있다.





'Language > C' 카테고리의 다른 글

Visual studio 6.0 환경변수 설정  (0) 2011.03.21
printf 예제  (0) 2011.03.17
Error 유형  (0) 2011.03.17
[Linux] gcc 컴파일 과정  (2) 2011.03.17
윈도우 환경에서 gcc 컴파일하기  (0) 2011.03.16
컴파일러(Compiler)의 기초 이야기  (0) 2011.03.11
Posted by 꿈을모아서

댓글을 달아 주세요