Syntax Highlighting에 대해서
글쓴이: 해밝 / 작성시간: 목, 2003/07/10 - 8:47오후
대부분의 에디터에서 제공하는 Syntax Highlighting 기능의 구현이 궁금한데 소스코드로는 볼 엄두가 나질 않네요. 계속 찾아보고는 있는데
간단하게 생각해본 바로는 Syntax Highlighting을 하기 위한 텍스트들을 가지고 있고 문서의 각 음절마다 비교하면서 색상을 입히기위한 코드(?)를 삽입하는 것이 한 방법이 되겠구나라고 생각했는데, 이러한 방법은 너무나 많은 오버헤드를 가질 것 같다는 생각이 듭니다.
1만개의 음절이 있고 1만개의 Syntax Highlighting을 위한 키워드가 있다고 할때 이 기능을 구현하려면 최대 1만 * 1만 번의 비교 연산이 이루어질 것같아서 말이죠.
물론 1만개의 키워드를 Syntax Highlighting하는 에디터는 없겠지만 말이죠.
이런 경우 어떠한 알고리즘을 생각할 수 있을까요?
Forums:
Re: Syntax Highlighting에 대해서
간단하게는 눈에 보이는 부분만... 처리를 하면 되겠죠 ^^
=========================
CharSyam ^^ --- 고운 하루
=========================
일단 알아야 할 것은
컴파일러이론이 반드시 필요합니다.
여기와 관련된 이산수학, 유한상태기계(FSM), 오토마타
이런것들도 다 필요합니다.
입력된 문자열을 토큰 단위로 끊은 뒤 각각의 토쿤이
주어진 규칙에 따라 조합되는지를
실시간으로 분석해서 종류에 따라 색을 달리 나타내야 하니까요
Written By the Black Knight of Destruction
간단한 highlighting 예제입니다
맞습니다. 당연히 그런 방식으로 해야죠.
그리고 비교하는 방법은 보통 정규식(regular expression)을 사용합니다.
다음은 C++용 정규식 라이브러리중 가장 유명한 regex++의 간단한 syntax highlighting 예제입니다. 비교적 복잡한 언어인 C++코드를 문법 강조된 HTML로 변환하는 데, 실제로 돌려보면 상당히 빠릅니다.
이 코드를 기초로 하여 원하는 기능을 구현해보세요.
다음은 위의 코드를 실제로 HTML로 변환한 문서의 링크입니다.
http://www.borlandforum.com/impboard/impboard.dll?action=read&db=cpp_tip&no=36
Re: 간단한 highlighting 예제입니다
한표~
신택스 하이라이트시 한가지 언어에 대한 경우라면 컴파일러 구성하는 스타일로 하는 방법도 있을 수 있겠지만(실시간 신택스 검증기능 추가등을 위해...), 이러한 기능이 불필요하고 다수개 언어(스크립트)의 신택스를 하이라이트 하실 경우에는 정규식을 이용한 방법도 좋은 방법으로 생각합니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
컴파일러 이론에 대해 간단히 나온 책
정규 표현식을 파서로 만들기 위해서
책을 한권 추천할께요. 한글이고 좋은 예제들이 많아요
"컴파일러 입문 , 오세만 저" 입니다.
1개의 단어대해 1만개 신택스 코드 검사라...그렇죠 평균을 따지만
1개의 단어대해 1만개 신택스 코드 검사라...
그렇죠 평균을 따지만 5000번 비교 연산이 필요하겠죠?
그런 많은 걸 전체를 다 검색하는 건 좋은 방법이 아니고요.
소팅을 해서 divide and conquer 하는 방법도 있겠죠.
(그거 있자나요 친구가 마음 속으로 임의의 숫자를 생각하고
내가 임의의 숫자를 말하면 내가 말한것 보다 크다, 작다 를 가르쳐 주면
점점 범위를 좁혀 나가는 방법이요)
아니면 해싱을 이용하는 방법도 있겠고
트리를 구성하고 그 트리를 따라 검색하는 방법도 있겠죠.
(트리의 경우 대표적인 예로 DB의 인덱싱이 있겠네요.)
가장 빠른건 해싱일 것 같네요.
STL의 해싱을 이용하면 해싱 구현도 그리 힘들지 않을 듯 하고요.
전체를 검색하는 방법 말고는 생각을 하지 못하셨다면
[자료구조론]을 공부해 보시면 도움이 많이 되실것 같네요.
Re: 컴파일러 이론에 대해 간단히 나온 책
"정규 표현식" 은 문맥에 따라 다른 (최소한 2개 이상의) 개념을 지칭하는
데 사용됩니다. 언급하신 책에서의 정규 표현식은 컴파일러 제작 (parser
부분) 을 위해 FSM 과 변환 가능한 것을 의미하며, 위의 소스를 보시면 다
른 개념의 "정규 표현식" 으로 highlighting 기능을 구현한 것을 확인하실
수 있습니다.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
댓글 달기