Scintilla icon 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).

기호 상수

프로그래밍 언어와 어셈블리 언어에는 기호상수 집합이 풍부하게 담겨 있을 수 있다. 예를 들어 숫자로 73.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임베드 베이직
booleanTrue 또는 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
predefined32부터 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++ 어휘 분석기는 (예를 들어) 비활성 상태가 있고 동적으로 할당된 부스타일이 있다. 이것들은 메타데이터 메커니즘을 통하여 노출되어야 마땅하나 지금은 지원하지 않는다.