2014-05-21 4 views
0

저는 C++ (Ubuntu 12.04. gcc 포함)로 컴파일러를 작성하고 있습니다. 지금까지 누적 된 오류/경고보고 및 오류/경고 위치의 상당히 정확한 행 및 열 번호로 정상적으로 작동합니다.에러가 발생한 컴파일러 런타임 오류보고

내 프로젝트 목표는이를 수행하는 방법을 배우는 것만 포함하므로 전처리 단계 (문자열 연결, 주석 제거 등과 같은 최소한의 작업 만 수행)에서 결과 tmp 파일을 만듭니다. 파싱하는 동안 내 렉서에서 문자열을 연결할 수 있고 렉서가 이미 주석을 처리하기 때문에이 시점에서는 필요하지 않지만 효율적으로 우아하게 처리하는 방법을 알고 싶습니다.

컴파일 시간 오류가 하드되지 않습니다
(1) 에러 체크 할 (-> 보고서 컴파일시 에러를)
(2)의 경우 오류, 전처리 -> tmp 파일
(3) 실행 파서 없습니다 등, tmp 파일에 (인 컴파일시 에러없이)

을하지만, 나 또한 (정수 표현의 경계와 배열에 대한 경계 검사에서 배열, 예를 들면) 행 번호와 함께 런타임 오류를보고합니다. tmp 파일 만 구문 분석 할 때 오류 검사가 IR의 바이트 코드에 추가되므로이 파일은 원본 파일과 상당히 다를 수 있습니다 (특히 헤더 파일을 붙여 넣기를 시작할 수있는 경우). 지구는 유용한 오류 위치를 합리적으로보고 할 수 있습니까? 이것을 처리하는 gcc의 표준 트릭이 있습니까? 물론 언급 된 바운드 확인 유형은 C에서 발생하지 않습니다. 런타임 오류보고는 말하자면 C++의 계층 구조에서 포인터의 동적 인 해상도에 적용되며, gcc는 라인 수를 그대로 유지합니다.

+1

tmp 파일에서 오류를 확인할 수 있습니다. 일부를 찾으면 특정 행을 저장하고 주 파일에서 해당 파일을 검색 할 수 있습니다. –

+0

@PawelStawarz : 나쁜 제안은 아니지만 상당히 복잡합니다. 현재의 오류 처리를 다시 고려한 것입니다.) (어쨌든 일어날 수 있습니다 :)). – gnometorule

답변

1

전 처리기에서 생성 한 임시 파일에 Line Control과 같은 줄 번호 정보를 기록 할 수 있습니다. cpp입니다.

C 사전 처리기는 소스 코드에서 각 토큰의 출처를 C 컴파일러에 알립니다. 현재 이것은 파일 이름과 행 번호입니다.