. 분석기 교체

호스트가 파일의 확장자와 분석기의 연결 관계를 알고 있기 때문에 파일을 열 때 대부분 적합한 분석기가 선택된다. 그러나 파일의 확장자가 엉뚱하게 붙여질 수 있으므로 호스트의 판단이 항상 정확한 것은 아니다. C 소스파일을 .txt로 작성할 수도 있고 웹 문서는 html, htm 외에도 asp, php, ph3, ph4 등 여러 가지 종류가 있다. h inl같이 여러 문법이 공유하는 확장자도 있으며 어떤 문서는 아예 확장자없이 만들어지기도 한다.

또한 작성중인 문서는 아직 저장되지 않았으므로 확장자를 가지지도 않으며 문서의 종류를 임의로 판단할 수 없다. 그래서 문서에 따라 분석기를 선택하는 작업이 호스트의 독점적인 권한이어서는 안되며 사용자가 임의로 분석기를 바꿀 수 있어야 한다. 메뉴에 지원 가능한 분석기의 목록을 보여주고 이 중 하나를 선택하면 즉시 분석기를 바꾸도록 한다. OnCommand에 다음 코드를 작성하자.

 

void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

     case IDM_SYN_NONE:

          pSi->Ae.SetParser(0);

          break;

     case IDM_SYN_CPP:

          pSi->Ae.SetParser(1);

          break;

     case IDM_SYN_HTML:

          pSi->Ae.SetParser(2);

          break;

     case IDM_SYN_SQL:

          pSi->Ae.SetParser(3);

          break;

 

이제 메뉴항목을 바꾸면 분석기가 교체되고 새로 바뀐 분석기에 의해 문서가 재분석될 것이다. 메뉴로 분석기를 선택할 수 있는 기능을 추가했으로 현재 선택된 분석기가 무엇인지 보여주는 기능도 당연히 있어야 한다.

 

void OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     if (hActive) {

          ....

          for (s=IDM_SYN_NONE;s<=IDM_SYN_SQL;s++) {

              CheckMenuItem(hMenu,s,MF_BYCOMMAND | MF_UNCHECKED);

          }

          switch (int(pSi->Ae.GetParser()->GetInfo(0)))

          {

          case 0:

              CheckMenuItem(hMenu, IDM_SYN_NONE, MF_BYCOMMAND | MF_CHECKED);

              break;

          case 1:

              CheckMenuItem(hMenu, IDM_SYN_CPP, MF_BYCOMMAND | MF_CHECKED);

              break;

          case 2:

              CheckMenuItem(hMenu, IDM_SYN_HTML, MF_BYCOMMAND | MF_CHECKED);

              break;

          case 3:

              CheckMenuItem(hMenu, IDM_SYN_SQL, MF_BYCOMMAND | MF_CHECKED);

              break;

          }

     }

}

 

현재 선택된 분석기의 종류를 알아내기 위해 ApiEdit.GetParser 함수를 호출하여 분석기 객체를 먼저 구하고 GetInfo 함수로 분석기의 ID를 조사한다. 분석기의 ID는 분석기별로 중복되지 않도록 할당되어 있으므로 ID만 알면 어떤 분석기가 동작중인지 쉽게 알 수 있다.