Crimson Editor

신택스 파일

이 문서는 Crimson Editor용 사용자 정의 신택스 파일을 만드는 방법을 설명합니다.

Revision History

New features in 3.30:

1. $BLOCKCOMMENT2ON, $BLOCKCOMMENT2OFF are added (to support DELPHI)
2. Line comment delimiters and block comment delimiters are not case sensitive
   - can use 'REM' as line comment delimiter
3. Block comment delimiters are checked prior to line comment delimiters
   - can use '*' as line comment delimiter, while set '/*' and '*/' as block
     comment delimiters


New features in 3.40:

1. $VARIABLEPREFIX, $SPECIALVARIABLECHARS are introduced to highlight
   variables (Perl, PHP, Bash)
2. $HEXADECIMALMARK is introduced to express hexa decimal numbers
3. $LINECOMMENTONFIRSTPOSITION is introduced to express line comment delimiter
   which has meaning only when it is positioned at the beginning of a line


New features in 3.45:

1. Three different kinds of link files (extension link files, firstline link
   files, pathname link files) to support automatic syntax type detection.
2. $QUOTATIONMARKRANGE, $LINECOMMENTRANGE, $BLOCKCOMMENTRANGE was introduced
   to restrict effective range of syntax definition delimiters.

신택스 파일 폴더

Crimson Editor 설치 디렉터리(예: C:\Program Files\Crimson Editor)에는 ‘link’와 ‘spec’ 폴더가 있습니다.

‘link’ 폴더에는 여러 종류의 링크 파일이 들어 있습니다. 링크 파일은 특정 파일 이름이나 파일 확장자를 가진 파일이 어떤 신택스 유형으로 분류되는지에 대한 정보만 담고 있습니다. 링크 파일은 열려 있는 문서의 신택스 유형을 자동으로 감지하는 데 사용됩니다.

‘spec’ 폴더에는 두 종류의 신택스 정의 파일이 있습니다.

  1. 언어 사양 파일 (예: PHP.SPC)
  2. 언어 키워드 파일 (예: PHP.KEY)

특정 신택스 유형이나 특정 프로그래밍 언어에는 각 종류의 신택스 정의 파일이 하나씩 필요합니다. 언어 사양 파일에는 해당 프로그래밍 언어의 속성을 정의하는 정보가 들어 있습니다. 언어 키워드 파일에는 해당 프로그래밍 언어에서 사용되는 키워드(예약어) 목록이 들어 있습니다.

링크 파일 (자동 신택스 유형 매핑)

다음 예시들은 예제 링크 파일의 내용과, 그 파일들이 Crimson Editor에서 열린 파일의 신택스 유형을 자동으로 감지하는 데 어떻게 사용되는지에 대한 설명을 보여줍니다.

1. 확장자 링크 파일 (EXTENSION.*)

-- EXTENSION.PL ---
LANGSPEC:PERL.SPC
KEYWORDS:PERL.KEY
--------------------

‘EXTENSION.PL’ 파일은 ’.PL’ 확장자를 가진 모든 파일을 PERL 신택스 유형으로 매핑합니다(PERL 신택스 유형은 두 개의 신택스 정의 파일 ‘PERL.SPC’와 ‘PERL.KEY’로 구성됩니다).

대부분의 경우, Crimson Editor는 이 방법을 사용해 파일의 신택스 유형을 성공적으로 감지할 수 있습니다.

2. 첫 줄 링크 파일 (FIRSTLINE.*)

-- FIRSTLINE.PL ----
CONTAINS:PERL
LANGSPEC:PERL.SPC
KEYWORDS:PERL.KEY
--------------------

‘FIRSTLINE.PL’ 파일은 첫 줄에 ‘PERL’이라는 키워드를 가진 모든 파일을 PERL 신택스 유형으로 매핑합니다(PERL 신택스 유형은 두 개의 신택스 정의 파일 ‘PERL.SPC’와 ‘PERL.KEY’로 구성됩니다).

Unix 시스템에서는 스크립트 파일의 첫 줄에 적절한 실행 파일(인터프리터)의 경로를 주석으로 적어 두어, 셸에게 그 스크립트 파일을 어떻게 실행할지 알려주는 방식을 선호합니다. 이 경우 스크립트 파일에는 보통 확장자가 없습니다. 다음 예시는 전형적인 perl 스크립트 파일의 첫 줄에 들어가는 정보를 보여줍니다.

#!/usr/bin/perl -w

3. 경로명 링크 파일 (PATHNAME.*)

-- PATHNAME.MAK ----
CONTAINS:MAKEFILE
LANGSPEC:MAKE.SPC
KEYWORDS:MAKE.KEY
--------------------

‘PATHNAME.MAK’ 파일은 경로명에 ‘MAKEFILE’이라는 키워드를 가진 모든 파일을 MAKE 신택스 유형으로 매핑합니다(MAKE 신택스 유형은 두 개의 신택스 정의 파일 ‘MAKE.SPC’와 ‘MAKE.KEY’로 구성됩니다).

‘make’는 대규모 소스 파일 모음을 관리하고 빌드하는 데 탁월한 유틸리티이며, ‘Makefile’은 그 표준 입력 데이터 파일의 기본 이름입니다. ‘Makefile’은 확장자도 없고 첫 줄에 별다른 정보도 없습니다. 이런 경우 Crimson Editor는 ‘PATHNAME.MAK’ 파일을 사용해 ‘Makefile’의 신택스 유형을 감지할 수 있습니다.

Crimson Editor에서 문서가 열리면, Crimson Editor는 이러한 링크 파일들을 사용해 열린 문서의 신택스 유형을 자동으로 감지하려고 시도합니다.

Crimson Editor는 적절한 링크 파일을 찾기 위해 다음 단계를 따릅니다.

  1. Crimson Editor는 “EXTENSION.” 문자열 뒤에 파일 확장자를 붙여 만든 이름의 사용 가능한 확장자 링크 파일이 있는지 검사합니다.
  2. Crimson Editor는 적절한 링크 파일을 찾을 때까지 모든 첫 줄 링크 파일을 검색합니다.
  3. Crimson Editor는 적절한 링크 파일을 찾을 때까지 모든 경로명 링크 파일을 검색합니다.

언어 사양 파일

언어 사양 파일은 프로그래밍 언어의 속성을 정의합니다. 예시로 ‘PHP.SPC’ 파일을 살펴봅시다.

------------------------ PHP.SPC ------------------------
# PHP LANGUAGE SPECIFICATION FILE FOR CRIMSON EDITOR

$CASESENSITIVE=NO
$DELIMITERS=~`!@#$%^&*()-+=|\{}[]:;"',.<>/?
$KEYWORDPREFIX=&
$VARIABLEPREFIX=$@%
$SPECIALVARIABLECHARS=*#'`!$@%
# $HEXADECIMALMARK=# - this disables line comment2 delimeter
$ESCAPECHAR=\
$QUOTATIONMARK1="
$QUOTATIONMARK2='
$QUOTATIONMARKRANGE=R1||R2
$LINECOMMENT=//
$LINECOMMENT2=#
# $LINECOMMENTONFIRSTPOSITION= - not used
$LINECOMMENTRANGE=RANGE1
$BLOCKCOMMENTON=/*
$BLOCKCOMMENTOFF=*/
# $BLOCKCOMMENT2ON= - not used
# $BLOCKCOMMENT2OFF= - not used
$BLOCKCOMMENTRANGE=RANGE1
$SHADOWON=<!-
$SHADOWOFF=-->
# $HIGHLIGHTON= - not used
# $HIGHLIGHTOFF= - not used
$RANGE1BEG=<?
$RANGE1END=?>
$RANGE2BEG=<
$RANGE2END=>
$INDENTATIONON={
$INDENTATIONOFF=}
$PAIRS1=()
$PAIRS2=[]
$PAIRS3={}
---------------------------------------------------------

COMMENT: 이미 눈치채셨겠지만, ’#‘으로 시작하는 모든 줄은 주석으로 간주됩니다(사실 ’$‘로 시작하지 않는 모든 줄은 무시됩니다).

CASESENSITIVE: 이 프로그래밍 언어가 대문자와 소문자를 구분하는지를 나타내는 플래그입니다. 이 정보는 어떤 단어가 예약어인지 아닌지를 판단하는 데 사용됩니다.

DELIMITERS: 이 프로그래밍 언어에서 사용되는 구분자입니다. 구분자에 속하지 않는 문자들의 집합은 예약어나 변수가 될 수 있습니다. 공백 문자(’ ’, ‘\t’, ‘\r’, ‘\n’)는 구분자로 명시적으로 선언할 필요가 없습니다. 공백 문자는 기본적으로 구분자로 간주됩니다. 이 정보는 문서의 신택스를 분석하는 데 매우 중요하며, 이 정보가 제대로 설정되지 않으면 Crimson Editor가 이상하게 동작할 수 있습니다.

KEYWORDPREFIX: 일부 프로그래밍 언어에는 특별한 의미를 가진 구분자가 있습니다. 예를 들어, C 언어의 ‘#include’는 전처리기 명령으로, 예약어로 간주되어야 합니다. 그러나 ’#‘은 C 언어에서 구분자이므로, 일반적인 방식으로는 ‘#include’를 예약어로 강조할 수 없습니다. 그래서 KEYWORDPREFIX가 필요합니다. KEYWORDPREFIX에 있는 구분자는 예약어의 앞부분이 될 수 있습니다. 이 예시에서는 HTML의 ‘&nbsp’, ‘&gt’, ‘&lt’ 같은 특수 코드가 있기 때문에 ’&‘를 KEYWORDPREFIX로 지정했습니다.

VARIABLEPREFIX: 일부 프로그래밍 언어에서는 변수 이름이 특수 구분자로 시작해야 합니다. 예를 들어, Perl의 변수는 ’$‘를 접두사로 가져야 합니다. 즉, ’$‘를 접두사로 가진 식별자는 변수로 간주됩니다.

SPECIALVARIABLECHARS: Perl에서는 ’$#’, ’$!’, ‘$$var’ 같은 것들도 변수입니다. 일반 변수 이름과 특수 변수 이름의 차이는, 특수 변수 이름은 구분자로 구성될 수 있다는 점입니다. SPECIALVARIABLECHARS에 있는 구분자는 변수 이름을 구성하는 데 사용될 수 있으며 Crimson Editor에서 올바르게 강조됩니다. SPECIALVARIABLECHARS는 VARIABLEPREFIX가 설정되어 있을 때만 사용됩니다.

HEXADECIMALMARK: 16진수는 숫자와 ‘A’부터 ‘F’ 사이의 문자로 구성됩니다. 보통 프로그래밍 언어는 16진수를 10진수나 식별자와 구별하기 위해 특별한 표시를 사용합니다. 예를 들어, C 언어에서 ‘0x0F3E’는 16진수이고, HTML에서 ‘#3E4F6A’는 16진수입니다.

ESCAPECHAR: 문자열 내의 이스케이프 문자입니다. 예를 들어, “She said “Hello world”.\n” 같은 문자열은 ”를 이스케이프 문자로 설정하지 않으면 올바르게 강조되지 않습니다. 대부분의 프로그래밍 언어에서 백슬래시(”)가 이스케이프 문자로 사용됩니다.

QUOTATIONMARK1, QUOTATIONMARK2: 따옴표 문자입니다. 이 문자들은 반드시 DELIMITERS 중 하나여야 합니다. 따옴표로 둘러싸인 문자열은 Crimson Editor에서 상수 문자열로 간주됩니다.

QUOTATIONMARKRANGE: 따옴표 문자의 유효 범위입니다. 가능한 범위는 미리 정의된 범위 상수 중 하나여야 합니다. GLOBAL, RANGE1, RANGE2, !RNGE1, !RNGE2, !R1&R2, R1||R2

LINECOMMENT, LINECOMMENT2, LINECOMMENTONFIRSTPOSITION: 줄 끝까지 이어지는 줄 주석의 시작을 나타내는 표시입니다. LINECOMMENTONFIRSTPOSITION은 줄 주석 구분자가 1번 열에 위치할 때만 효과가 있습니다.

BLOCKCOMMENTON, BLOCKCOMMENTOFF, BLOCKCOMMENT2ON, BLOCKCOMMENT2OFF: 블록 주석의 시작과 끝을 나타내는 표시입니다.

LINECOMMENTRANGE, BLOCKCOMMENTRANGE: 주석 구분자의 유효 범위입니다. 가능한 범위는 미리 정의된 범위 상수 중 하나여야 합니다. GLOBAL, RANGE1, RANGE2, !RNGE1, !RNGE2, !R1&R2, R1||R2

SHADOWON, SHADOWOFF: 음영 처리된 텍스트의 시작과 끝을 나타내는 표시입니다. (음영 텍스트는 ASP, JSP, PHP 문서의 HTML 주석을 위해 설계되었습니다.)

HIGHLIGHTON, HIGHLIGHTOFF: 강조 처리된 텍스트의 시작과 끝을 나타내는 표시입니다. (강조 텍스트는 XML 문서에서 꺾쇠 괄호 사이의 모든 문자열을 강조하기 위해 설계되었습니다.)

RANGE1BEG, RANGE1END, RANGE2BEG, RANGE2END: 범위의 시작과 끝을 나타내는 표시입니다. 범위는 키워드의 유효 범위를 제한하는 데 사용됩니다. 이 PHP 예시에서 ''는 PHP 코드 블록의 시작과 끝을 나타냅니다. 그리고 ’<‘와 ’>‘는 HTML 태그의 시작과 끝을 나타냅니다. RANGE1 구분자는 항상 RANGE2 구분자보다 먼저 검사됩니다.

$INDENTATIONON, $INDENTATIONOFF: 자동 들여쓰기 문자입니다. ’{‘와 ’}‘는 거의 모든 프로그래밍 언어에서 동작합니다. 이 문자들은 DELIMITERS로 선언되어야 합니다.

$PAIRS1, $PAIRS2, $PAIRS3: 짝 강조 기능을 위해 검사할 짝입니다. 짝의 순서가 중요합니다. 첫 번째 문자는 여는 괄호여야 하고, 두 번째 문자는 닫는 괄호여야 합니다. 이 문자들은 DELIMITERS로 선언되어야 합니다.

언어 키워드 파일

언어 키워드 파일에는 해당 프로그래밍 언어에서 사용되는 키워드(예약어) 목록이 들어 있습니다. 예시로 ‘PHP.KEY’ 파일을 살펴봅시다.

------------------------ PHP.KEY ------------------------
[-COMMENT-:GLOBAL]
# PHP LANGUAGE KEYWORDS FILE FOR CRIMSON EDITOR

[KEYWORDS0:RANGE1]
and abs addslashes array

[KEYWORDS1:RANGE1]
mysql_affected_rows mysql_close mysql_connect mysql_data_seek

[KEYWORDS5:!R1&R2]
a abbr above acronym address applet array area

[KEYWORDS6:!R1&R2]
abbr accept accesskey action align alink alt applicationname archive axis

[KEYWORDS7:!RNGE1]
white black red green blue yellow magenta orange purple

[KEYWORDS8:!RNGE1]
&aacute &agrave &acirc &amp &atilde &aring &auml &aelig
---------------------------------------------------------

프로그래밍 언어의 키워드를 각 키워드 그룹에 할당하는 방법은, [KEYWORDS0:GLOBAL] 같은 특수 태그 뒤에 키워드 목록을 적는 것입니다. 다음은 각 태그의 의미입니다.

키워드 그룹

태그의미
-COMMENT-주석, 무시됩니다
KEYWORDS0KEYWORDS0 그룹에 키워드를 할당합니다.
KEYWORDS1KEYWORDS1 그룹에 키워드를 할당합니다.
KEYWORDS2KEYWORDS2 그룹에 키워드를 할당합니다.
KEYWORDS9KEYWORDS9 그룹에 키워드를 할당합니다.

키워드 범위

범위의미
GLOBAL다음 키워드들은 문서 전체에서 효과가 있습니다.
RANGE1다음 키워드들은 RANGE1 안에서만 효과가 있습니다.
RANGE2다음 키워드들은 RANGE2 안에서만 효과가 있습니다.
!RNGE1다음 키워드들은 RANGE1 밖에서만 효과가 있습니다.
!RNGE2다음 키워드들은 RANGE2 밖에서만 효과가 있습니다.
!R1&R2다음 키워드들은 RANGE1 밖이면서 RANGE2 안에서만 효과가 있습니다.
R1||R2다음 키워드들은 RANGE1 안 또는 RANGE2 안에서만 효과가 있습니다.

하나의 키워드 그룹에 할당된 모든 키워드는 Crimson Editor에서 같은 색으로 표시됩니다. 사용자는 서로 다른 키워드 그룹에 서로 다른 색을 지정할 수 있습니다.

키워드 범위는 조금 이해하기 어렵습니다. PHP를 예로 들면, ''로 둘러싸인 텍스트는 PHP 코드 블록이며, 앞서 본 PHP.SPC 파일에서 이 구분자로 둘러싸인 범위가 RANGE1로 정의되어 있습니다. 따라서 ‘if’나 ‘for’ 같은 PHP 키워드의 유효 범위는 RANGE1이어야 합니다. 반면, ’<‘와 ’>‘로 둘러싸인 텍스트는 HTML 태그이며, 이 구분자로 둘러싸인 범위는 RANGE2로 정의되어 있습니다. 따라서 ‘table’이나 ‘form’ 같은 HTML 키워드의 유효 범위는 !R1&R2여야 합니다.