Scintilla |
신틸라는 다양한 언어를 위한 어휘 분석기를 갖추고 있다:
어떤 언어는 전혀 다르게 사용될 수도 있다. 자바스크립트는 프로그래밍 언어이면서도 JSON 데이터 파일의 토대이기도 하다. 비슷하게, Lisp 언어의 표현을 소스 코드와 데이터에 사용할 수 있다.
각 언어 유형마다 공통적인 요소들이 있다. 프로그래밍 언어에서의 식별자 같이 이런 공통 요소들을 식별하여야 화면에 공통 스타일로 언어를 보여줄 수 있다. 신틸라는 이런 목적으로 스타일 태그를 사용한다.
스타일마다 태그 리스트가 있다. 태그는 소문자 단어로서 예를 들어 "comment"나 "operator"와 같이 안에 ASCII 기호로 'a'-'z'만 담긴다.
태그는 중요한 순서대로 순위가 매겨진다.
어플리케이션에서 태그 리스트에 시각적 속성을 여러가지 방식으로 할당할 수는 있지만,
합리적인 테크닉은 태그-종속적 속성을 역순으로 적용해서 앞쪽의 더 중요한 태그가 덜 중요한 태그를 덮어쓰도록 하는 것이다.
예를 들어 태그 리스트가 다음과 같고
"error comment documentation keyword"
다음 태그 속성 집합이 주어진다면
{ comment=fore:green,back:very-light-green,font:Serif documentation=fore:light-green error=strikethrough keyword=bold }
다음과 같이 화면에 보여줄 수 있을 것이다.
bold,fore:light-green,back:very-light-green,font:Serif,strikethrough
다른 방식으로 다중-태그 조합을 가공해 보여줄 수 있다. 예를 들어
{ comment.documentation=fore:light-green comment.line=dark-green comment=green }.
보통, 태그 리스트에는 선택적으로 임베드 언어, 상태, 기본 유형, 유형 변경자 집합이 포함될 것이다:
embedded-language? status* base-type modifiers*
임베드 언어는 소스 (client | server)
가 오고 다음에 언어 이름
(javascript | php | python | basic)
이 따라온다.
이것은 앞으로 다른 언어와 CSS와 같은 스타일 정의 언어로 확장될 가능성이 있다.
다음과 같은 상태가 있다: (error | unused | predefined | inactive)
.
error
상태는 어휘를 분석하여 소스 코드에 에러가 있음을 알려주는 데 사용된다. 문자열이 인용 부호로 제대로 끝나지 않는 경우가 이에 해당한다.
unused
상태는 어휘 분석에 틈이 있음을 알려준다.
가능성 있는 이유로는 예전 어휘분석 클래스가 더 이상 사용되지 않거나 앞으로 나올 어휘분석 클래스가 그 위치를 채울 가능성이 있기 때문이다.
predefined
상태는 32에서 39까지 범위의 스타일을 나타낸다. 이 범위는 신틸라에서 언어 분석의 목적 외에 사용된다.
inactive
상태는 현재 번역되지 않는 텍스트에 사용된다. 예를 들어 C++ 코드가 '#if 0' 전처리기 블록 안에 들어 있는 경우가 이에 해당된다.
다음은 프로그래밍 언어의 기본 유형이다: (default | operator | keyword | identifier | literal | comment | preprocessor | label)
.
default
유형은 주로 토큰 사이의 탭이나 공간 문자에 사용된다. 물론 다른 문자도 언어에 따라 사용할 수 있다.
어셈블리어는 기본 유형에 다음 유형이 추가된다: (instruction | register)
.
다음은 조판 언어의 기본 유형이다: (default | tag | attribute | comment | preprocessor)
.
다음은 데이터 기술 언어의 기본 유형이다: (default | key | data | comment)
.
프로그래밍 언어는 라인 주석과 스트림 주석을 다르게 간주할 수도 있다.
문서화 주석을 다른 주석과 전혀 다르게 취급한다.
문서화 주석은 documentation 키워드로 조판할 수 있다.
많이 사용되는 추가 속성은 다음과 같다: (line | documentation | keyword | taskmarker)
.
프로그래밍 언어와 어셈블리 언어에는 기호상수 집합이 풍부하게 담겨 있을 수 있다. 예를 들어 숫자로 7
과 3.89e23
문자열로 "string\n"
이 있고
그리고 nullptr
이 있는데 이 모든 것은 서로 구분이 필요하다.
다음은 자주 보는 기호상수 유형이다: (numeric | boolean | string | regex | date | time | uuid | nil | compound)
.
숫치 기호상수 유형은 다음과 같이 더 나뉜다: (integer | real)
.
다음은 문자열 기호상수이다: (heredoc | character | escapesequence | interpolated | multiline | raw)
. 앞으로 (아마도 여러) 속성을 더 추가할 가능성이 있다.
그러므로 삽입된 heredoc 안에 있는 피신열은 다음과 같이 표현된다: literal string heredoc escapesequence
.
attribute | 조판 속성 |
basic | 임베드 베이직 |
boolean | True 또는 false |
character | 문자열 기호상수에 반하는 단일 문자 |
client | 클라이언트쪽에서 실행된 스크립트 |
comment | 표준 주석 유형. 스트림 주석 아니면 라인 주석이 보통이다. |
compound | 안에 또 여러 기호상수가 들어 있는 기호상수. 예를 들어 터플이나 복소수 |
data | 테이터 파일의 값 |
date | 문자 그대로의 데이터 표현: '19/November/1975' |
default | 주로 공백 문자에 사용되는 시작 상태 |
documentation | 문서화를 위해 추출할 수 있는 주석 |
error | 불법적인 또는 에러 요소를 나타내는 상태 |
escapesequence | 문자 그대로의 의미가 아닌 문자열. C에서 탭을 의미하는 '\t' |
heredoc | 양쪽 끝에 단어로 표식이 붙은 기다란 문자 그대로의 텍스트 |
identifier | 객체 또는 객체 클래스를 식별하는 이름 |
inactive | 현재 번역되지 않은 코드 |
instruction | 어셈블리 언어에서의 연상기호(Mnemonic): 'addc' |
integer | 분수나 지수가 없는 숫자: '738' |
interpolated | 표현식을 담을 수 있는 문자열 |
javascript | 임베드 자바스크립트 |
key | 연관 데이터를 찾기 위한 필수 요소 |
keyword | 특별한 의미를 지닌 예약어: 'while' |
label | 프로그래밍 언어와 어셈블리 언어에서 건너 뛸 목적지 |
line | 스트림 주석과 줄 주석을 둘 모두 갖춘 언어는 서로 구별한다 |
literal | 소스 코드에 고정된 값 |
multiline | 단일 줄과 다중 줄을 구별한다. 보통은 문자열이다 |
nil | 널 포인터: C++의 nullptr 또는 C의 NULL |
numeric | 문자 그대로의 숫자: '16' |
operator | 구두점 문자: '&' or '[' |
php | 임베드 PHP |
predefined | 32부터 39 범위의 스타일. 어휘 분석 목적으로 사용되지 않는다. |
preprocessor | 번역의 초기 단계에 인식되는 요소 |
python | 임베드 파이썬 |
raw | 해석이 필요없는 문자열 유형. 특별히 유형을 지정하지 않고 언어에서 정규 표현식으로 사용 가능하다. |
real | 분수나 지수가 있는 숫자: '3.84e-15' |
regex | 정규 표현식: '^[a-z]+' |
register | 어셈블리 언어의 CPU 레지스터 |
server | 서버 위에 실행되는 스크립트 |
string | 일련의 문자 |
tag | '<br />' 같은 조판 태그 |
taskmarker | 앞으로 할 일을 위해 주석 안에 다는 표식. 예를 들어 'FIXME' |
time | 시간을 문자 그대로 표현. 예 '9:34:31' |
unused | 현재 사용되지 않는 스타일 |
uuid | 인터페이스 정의에 자주 사용되는 유일한 식별자: '{098f2470-bae0-11cd-b579-08002b30bfeb}' |
이 체계에서 각 요소는 미래에 확장될 가능성이 있다. 새로운 특징에 공통적으로 접근할 수 있도록 이 문서를 개정할 것이다. 어휘분석기마다 개별적으로 새로운 태그를 통하여 언어의 독특한 특징을 보여주기로 결정할 수 있다.
태그는 사용자 인터페이스나 구성 언어에 직접적으로 노출될 수 있다.
그렇지만 어플리케이션은 태그를 그의 명명 체계에 부합하도록 번역할 수도 있다.
대문자화와 구두점은 다를 수 있다 (예를 들어 heredoc
대신에 Here-Doc
이라고 기술 가능). 전문용어가 바뀔 수 있다 ("literal" 대신에 "constant"). 아니면 영어에서 중국어나 스페인어로 바뀔 수도 있다.
이런 변경에 손쉽게 적응하기 위하여 먼저 공통적인 태그 집합부터 시작한다.
C++ 어휘 분석기는 (예를 들어) 비활성 상태가 있고 동적으로 할당된 부스타일이 있다. 이것들은 메타데이터 메커니즘을 통하여 노출되어야 마땅하나 지금은 지원하지 않는다.