오류 구문 분석기 플러그인 쓰기

오류 구문 분석기의 작업은 컴파일러 또는 빌드 도구 결과물에서 경고, 오류 및 기타 중요한 메시지를 인식하고 이에 대한 "문제점 마커" 오브젝트를 작성하는 것입니다. Eclipse는 문제점 마커를 프로젝트 탐색기 및 문제점 보기뿐만 아니라 편집기에 오류 또는 경고 아이콘으로 표시합니다.

오류 구문 분석기가 생성한 문제점 마커

IBM Rational Developer for Power Systems Software는 현재 지원되지 않는 빌드 도구나 컴파일러를 사용하는 경우 빌드 오류를 인식하지 못할 수도 있습니다. 이러한 경우에는 사용자의 빌드 도구에 보다 잘 통합되는 사용자 고유의 오류 구문 분석기 플러그인을 작성하고 싶을 수도 있습니다.

첫 번째 단계는 플러그인을 작성하기 위한 환경을 설정하는 것입니다. 이는 플러그인으로 확장에 대한 절에 설명되어 있습니다. 환경을 설정한 후에는 오류 구문 분석기 작성 방법을 설명하는 다음 학습서를 계속하십시오.


새 플러그인 프로젝트 작성

파일 > 새로 작성 > 프로젝트를 선택하면 새 프로젝트 마법사 선택 대화 상자가 열립니다. 이 대화 상자에서 플러그인 프로젝트를 선택하고 다음을 클릭하십시오.

새 프로젝트 마법사 선택 대화 상자

프로젝트에 이름을 제공하십시오. 플러그인 이름은 주로 java 패키지와 유사한 이름 지정 규칙을 따릅니다.

대상 플랫폼 섹션 아래에서 Eclipse 버전 3.4가 선택되어 있는지 확인하십시오. 이는 IBM Rational Developer for Power Systems Software가 현재 기반으로 하는 eclipse 버전이며 이후 버전은 작동하지 않습니다.

새 플러그인 프로젝트 마법사 - 페이지 1

마법사의 두 번째 페이지로 진행하려면 다음을 클릭하십시오.

마법사의 두 번째 페이지에서 "이 플러그인은 UI를 만듭니다" 선택란을 선택 취소하십시오. 이 학습서는 사용자 인터페이스 컴포넌트를 개발하지 않기 때문입니다.

"액티베이터 생성" 선택란을 선택된 상태로 두십시오. 그러면 플러그인 라이프사이클 이벤트에 응답하는 데 사용되는 액티베이터 클래스가 생성됩니다. 이 학습서에서는 실제로 이러한 이벤트에 응답할 필요가 없지만 대부분의 중요한 플러그인은 주로 이러한 이벤트에 응답해야 하므로 이러한 클래스가 현재는 필요하지 않더라도 지금 생성하는 것이 좋습니다.

새 플러그인 프로젝트 마법사 - 페이지 2

완료를 클릭하십시오.


종속성 구성

패키지 탐색기에서 새로 작성된 프로젝트로 이동하고, META-INF 폴더를 열고 MANIFEST.MF 파일을 두 번 클릭하십시오.

MANIFEST.MF를 표시하는 패키지 탐색기

그러면 플러그인의 메타데이터를 구성하는 데 사용되는 플러그인 Manifest 편집기가 열립니다. 편집기 맨 아래에서 종속성 탭을 클릭하십시오.

종속성 편집기

오류 구문 분석기를 쓰는 데 필요한 API에 액세스하기 위해서는 두 개의 플러그인 종속성을 추가해야 합니다. 필수 플러그인 아래에서 추가 단추를 클릭하여 시작하면 플러그인 선택 대화 상자가 열립니다. 필터 상자에 org.eclipse.cdt.core를 입력하고 해당 플러그인을 선택한 후 확인을 클릭하십시오. 이 프로세스를 두 번 이상 반복하고 org.eclipse.core.resources 플러그인을 추가하십시오.

플러그인 선택기

필수 플러그인은 다음과 같은 모양이어야 합니다. 변경을 저장하십시오.

종속성 편집기


오류 구문 분석기 클래스 작성

이제 오류 구문 분석기의 코드를 포함하는 Java 클래스를 작성할 시간입니다. 패키지 탐색기에서 src 폴더를 펼치십시오. 여기에 자동으로 생성된 Java 패키지가 있습니다. 패키지를 마우스 오른쪽 단추로 클릭하고 새로 작성 > 클래스를 선택하십시오.

새 클래스 작성

그러면 새 Java 클래스 마법사가 열립니다. 클래스에 이름을 제공하십시오(예: "MyErrorParser").

새 Java 클래스 마법사

인터페이스 섹션 옆의 추가 단추를 클릭하면 구현된 인터페이스 선택 대화 상자가 열립니다. 필터 상자에 "IErrorParser"를 입력하고 IErrorParser 인터페이스를 선택하십시오.

구현된 인터페이스 선택 대화 상자

완료를 클릭하면 오류 구문 분석기의 새 클래스가 processLine() 메소드의 스텁 구현과 함께 작성됩니다.

스텁 오류 구문 분석기


오류 구문 분석기 등록

코드를 쓰기 전에 새 오류 구문 분석기가 IBM Rational Developer for Power Systems Software에서 인식되는지 확인하십시오. 플러그인 Manifest 편집기를 다시 열고 맨 아래의 확장기능 탭을 클릭하십시오.

확장기능

추가 단추를 클릭하여 새 확장기능 대화 상자를 여십시오. org.eclipse.cdt.core.ErrorParser 확장점을 선택하고 완료를 클릭하십시오.

새 확장기능 대화 상자

org.eclipse.cdt.core.ErrorParser 확장기능이 이제 모든 확장기능 섹션 아래에 나타나야 합니다.

확장기능

맨 아래에서 plugin.xml 탭을 클릭하여 plugin.xml 파일을 편집기에서 여십시오. 파일 본문이 다음과 같도록 파일을 편집하십시오.

<plugin>
   <extension
         id="org.mycompany.errorparser.MyErrorParser"
         name="Test Error Parser"
         point="org.eclipse.cdt.core.ErrorParser">
      <errorparser
          class="org.mycompany.errorparser.MyErrorParser">
      </errorparser>
   </extension>
</plugin>

<errorparser> 요소의 클래스 속성에는 IErrorParser 인터페이스를 구현하는 클래스의 완전한 이름이 포함되어야 합니다.

이 시점에서 IBM Rational Developer for Power Systems Software가 새 오류 구문 분석기를 인식하는지 테스트해보는 것이 좋습니다. 플러그인으로 확장 섹션에서 작성된 실행 구성을 사용하여 IBM Rational Developer for Power Systems Software를 시작하십시오. IBM Rational Developer for Power Systems Software에서 원격 C/C++ 퍼스펙티브로 전환하십시오. 작업공간에 아직 프로젝트가 없으면 하나 작성하십시오.

프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 특성을 여십시오. C/C++ 빌드 > 설정으로 이동하십시오. 오류 구문 분석기 탭 아래에 새 오류 구문 분석기가 나열되어야 합니다. 옆의 선택란을 클릭하여 사용 가능으로 설정한 다음 이를 맨 위로 이동하여 다른 오류 구문 분석기보다 우선권을 갖도록 하십시오. 개발 중인 다른 모든 오류 구문 분석기를 사용 안함으로 설정하는 것도 좋은 방법입니다. 확인을 클릭하십시오.

설정 특성 페이지


구문 분석 코드 쓰기

이제 실제로 오류 구문 분석기의 코드를 쓰기 시작할 시간입니다.

빌드가 발생할 때마다 빌드 명령의 결과물이 오류 구문 분석기의 시퀀스에서 한 번에 한 행을 입력합니다. processLine() 메소드는 각 결과물 행마다 한 번씩 호출되고 결과물 행을 포함하는 문자열과 ErrorParserManager에 대한 참조의 두 개의 인수가 전달됩니다. 관리자 오브젝트에는 문제점 마커 오브젝트 작성을 돕는 몇 가지 편리한 메소드가 있습니다.

일반 패턴은 각 행을 컴파일러 경고 또는 오류 메시지로 인식하려고 시도하는 것입니다. 이를 수행하는 방법은 행을 정규식과 일치시키고 영역 캡처를 사용하여 파일 이름, 행 번호 및 오류 메시지 등과 같은 관심 있는 행의 일부를 추출하는 것입니다.

오류 구문 분석기를 작성하는 방법은 실제로는 사용 중인 빌드 도구와 컴파일러에 달려 있습니다. IBM의 XLC 컴파일러의 오류 메시지를 인식하는 구현 예제가 아래에 제공되어 있습니다.


package org.mycompany.errorparser;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.ErrorParserManager;
import org.eclipse.cdt.core.IErrorParser;
import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.core.resources.IResource;


public class MyErrorParser implements IErrorParser {

    static String regexp = "\"((?:\\w|\\.)+)\", line (\\d+)\\.\\d+: (.*)";
    static Pattern errorPattern = Pattern.compile(regexp);

    public boolean processLine(String line, ErrorParserManager manager) {
        Matcher matcher = errorPattern.matcher(line);
        if(!matcher.matches())
            return false;
		
        String fileName = matcher.group(1);
        int lineNumber  = Integer.parseInt(matcher.group(2));
        String message  = matcher.group(3);
		
        IResource resource = manager.findFileName(fileName);
        if(resource == null)
            resource = manager.findFilePath(fileName);
        if(resource == null)
            resource = manager.getProject(); // file not found in workspace, attach problem to project

        // create a problem marker that will show up in the problems view
        int severity = IMarkerGenerator.SEVERITY_ERROR_RESOURCE;
        manager.generateMarker(resource, lineNumber, message, severity, null);
        return true;
    }
}

먼저 행이 정규식과 일치합니다. 일치하지 않으면 false가 리턴됩니다. 이는 ErrorParserManager에게 이 오류 구문 분석기가 행을 인식하지 않았음을 알려줍니다. 이 경우 ErrorParserManager는 행을 시퀀스의 다음 오류 구문 분석기에 제공합니다.

행이 일치하지 않으면 eclipse가 사용자에게 표시할 "문제점 마커"를 작성하는 것이 오류 구문 분석기의 작업입니다. 이 예제에서 행에서 관련 정보를 추출하는 데 그룹 캡처가 사용됩니다. 정규식 및 그룹 캡처의 자세한 설명은 java.util.regex.Pattern 클래스에 대한 javadocs를 참조하십시오. 또는 정규식을 사용하고 싶지 않은 경우에는 문자열 클래스에는 문자열을 구문 분석하기 위한 몇몇 유용한 메소드뿐만 아니라 java.util.StringTokenizer 클래스가 들어 있습니다.

다음 단계는 오류 메시지에서 파일 이름과 일치하는 IResource를 찾는 것입니다. IResource 오브젝트는 eclipse 작업공간에서 파일 또는 디렉토리를 표시합니다. (자세한 정보는 org.eclipse.core.resources.IResource 인터페이스의 javadocs를 참조하십시오). ErrorParserManager에는 파일 이름을 IResource 오브젝트로 변환하기 위한 몇 가지 유용한 메소드가 있습니다. 파일 이름과 일치하는 IResouce를 찾지 못한 경우에는 프로젝트 자체를 사용하는 기본값을 사용할 수 있습니다.

이 정보가 계산되면 문제점 마커 오브젝트를 작성하는 데 generateMarker() 메소드가 사용됩니다. org.eclipse.cdt.core.IMargerGenerator 인터페이스에는 여러 심각도 레벨에 대한 상수가 들어 있습니다. 이 예제에서 오류 구문 분석기는 오류의 심각도가 있는 마커만을 생성하지만 실제 오류 구문 분석기는 경고 및 정보 마커 또한 생성합니다.

사용자 정의 오류 구문 분석기를 실제로 개발할 때에는 IBM Rational Developer for Power Systems Software를 eclipse 디버거에서 실행하는 것이 매우 편리하다는 점을 알게 될 것입니다. eclipse 디버거는 클래스 파일의 "핫스왑"이 가능합니다. 즉 오류 구문 분석기 코드를 변경할 수 있으며 이러한 변경을 적용하기 위해 디버거를 다시 시작할 필요가 없다는 의미입니다. 변경한 다음에 파일 eclipse를 저장하면 코드가 자동으로 다시 컴파일되고 새 버전의 클래스 파일이 IBM Rational Developer for Power Systems Software의 실행 중인 인스턴스로 로드됩니다.

오류 구문 분석기가 문제점 마커를 제대로 생성하는 경우에는 이들이 프로젝트 탐색기, 문제점 보기 및 편집기 자체에 나타나는 것을 볼 수 있습니다.

오류 구문 분석기가 생성한 문제점 마커


플러그인 배치

오류 구문 분석기가 완성된 후에는 플러그인을 빌드하고 분배해야 합니다. 이 프로세스는 실제로 매우 간단합니다. 프로젝트를 마우스 오른쪽 단추로 클릭하고 내보내기를 선택하십시오. 그런 다음 내보내기 마법사에서 플러그인 개발 > 배치 가능한 플러그인 및 단편을 선택하고 다음을 클릭하십시오.

내보내기 마법사

마법사의 두 번째 페이지에서 플러그인을 선택한 다음 내보내기 목적지를 선택하고 완료를 클릭하십시오.

내보내기 마법사

선택한 위치에서 이름이 plugins인 폴더를 찾으면 이 폴더에서 플러그인이 들어 있는 jar 파일을 찾을 수 있습니다. 이 파일을 IBM Rational Developer for Power Systems Software 설치의 SDPShared 폴더 아래에 있는 plugins 폴더에 복사하고 평상시와 같이 이를 시작하십시오. 마지막 단계는 프로젝트 특성에서 오류 구문 분석기를 사용 가능으로 설정하는 것입니다.

오류 구문 분석기 특성 페이지

IBM Rational Developer for Power Systems Software는 이제 사용자 정의 빌드 도구의 결과물을 인식합니다.