2012-03-16 3 views
2

입력이 유니 코드 형식 일 때 줄과 열을 가리키는 컴파일러 스타일 오류 메시지를 제공하는 표준/공통 방법이 있습니까?유니 코드로 컴파일러 오류 메시지 줄/열 번호보고

예를 들어, 매우 일반적인 컴파일러 오류 메시지 형식은 다음과 같습니다 "파일 이름 : LINE_NUMBER는 : column_number : 오류 메시지"예 :

  • (GCC에서) : bad.c:1:10: syntax error, unexpected STRING
  • (사용자 지정 도구에서)

입력이 고정 된 8 비트 인코딩 (예 : ISO-8859-1) 인 경우 명확합니다. 그러나 입력이 유니 코드 (UTF-8, UTF-16 등) 인 경우이 경우 "열"은 무엇을 의미합니까 (또는해야합니까?)? 어떤 바이트 요? 어떤 코드 포인트? 어떤 글씨인가? 선례를 선택하는 도구가 있습니까?

답변

2

은 비 결합 유니 코드 코드를 참조해야합니다. 서로 게이트 쌍 (UTF-16)의 두 부분은 열을 공유해야합니다. 분음 기호을 합친 은 수정하는 기본 문자와 열을 공유해야합니다. 이는 다른 비 스페이싱 코드 포인트에도 적용될 수 있습니다.

+1

나는 당신의 대답과 일치하는 것이 내가 원하는 것을 발견했다고 생각한다. http://unicode.org/reports/tr29/에서 정의 된 확장 된 제자 클러스터. ICU의 BreakIterator를 통해이 문제를 해결할 수 있습니다. – wjl

1

GNU 코딩 표준에서는 열 번호를 계산할 때 유니 코드 문자 너비를 사용해야한다고 나와 있습니다 (http://www.gnu.org/prep/standards/standards.html#Errors).

오류 메시지를 사용하는 Emacs가 열 번호를 계산하는 방법과 호환되어야합니다 (https://www.gnu.org/software/emacs/manual/html_node/elisp/Columns.html).

GCC에 관한 버그가있는 것 같습니다 : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49973.

0

컴파일러 및 유사한 도구의 오류 메시지에서 "열"값이 어떻게 해석되는지에 대한 보편적 인 대답은 없습니다. 거의 모든 툴과 에디터가 존경하는 것처럼 보이는 1 기반이라는 사실 외에도, 내가 아는 한 다른 솔루션 중 하나에 대한 표준은 확립되어 있지 않습니다. 내가 Ubuntu 14.04 시스템을 사용할 수있는 한 바닐라 GCC와 바닐라 이맥스조차도 탭 문자 처리에 동의하지 않는다. GCC는 탭 하나를 문자로 계산하는 반면 Emacs는 많은 문자가 실제로 들여 쓰기 때문에 탭을 해석한다. 그것.

다음은 내 개인적인 제안입니다. 나는 그것에 대한 피드백을 얻고 싶다. 이러한 오류 메시지를 출력하는 도구를 작성하는 사람은 바이트 수를 계산하고 탭, 유니 코드, 서로 게이트 쌍 또는 결합 문자에 대한 특별한 처리는하지 않을 것을 제안합니다. 사용자가 열 번호를 거의 읽지 않으므로이 방법이 가장 유용합니다. 대신, 열 번호는 거의 항상 사용자 인터페이스에 의해 구문 분석됩니다. 이렇게하면 메시지를 출력하는 도구뿐 아니라 메시지를 표시하는 응용 프로그램에서 도구를 쉽게 출력 할 수 있습니다. 내 제안의 끝.

실용적으로, 나는 당신이 사용하고있는 프로그래밍 언어에서보다 편리하게 출력 할 것이다.