2013-11-25 1 views
0

하이 라이터가 렉서를 사용하여 백그라운드 작업을 수행한다고 가정하면 라이브 구문 강조 표시가있는 IDE에서 타이핑 할 때 렉서가 전체 파일을 Java, C++, Python 등의 언어로 다시 토큰 화해야합니까?), 렉서는 현재 라인을 다시 읽거나 토큰 화해야하나요? 아니면 한 번에 하나의 문자/단어 만 사용하고 있습니까?IDE에서 구문 형광펜이 문자를 입력 할 때마다 전체 파일을 검색합니까?

많은 편집자/IDE에서 대부분의 코드는 프로그래머가 입력하는 것과 동일하기 때문에 묻습니다. 어떤 경우에는 나머지 문자열을 다시 강조 표시하는 문자열 리터럴을 시작하는 것과 같은 경우가 있습니다. , 다른 경우에는 여러 줄 주석을 시작하는 것과 같이 전체 텍스트 파일이 여러 줄 주석을 시작한 지점에서부터 파일 끝까지 다시 강조 표시됩니다.

입력 된 모든 단일 문자에 대해 전체 파일에 대해 어휘 분석을 수행해야하는 경우, 특히 더 큰 (100.000+ 줄) 텍스트 파일의 경우 속도가 느려지지 않습니까?

답변

1

구문 강조 및 의미 강조가 있습니다.

구문 강조는 언어 구문을 기반으로 만 편집기를 꾸미는 경우입니다. 예 : 식별자는 검은 색이고 키워드는 분홍색이고 주석은 녹색입니다. 구문 강조는 전체 파일을 반드시 재분석 (또는 오히려 토큰 화)하지 않으며 '손상된 영역'만 토큰화할 수 있습니다 (예 : 편집 위치 주변의 토큰). 물론 편집기 개발자는 입력 내용 전체를 토큰화할 수 있습니다. 실제로는 빠르고 오류가없고 구현하기가 쉽습니다.

시맨틱 하이라이트 (예 : 글로벌 식별자와 로컬 식별자를 다르게 강조 표시 할 수있는 기능)는 일반적으로 전체 재분석이 필요합니다. Java에서 "정적"을 함수 선언에 추가하면 커서 위와 아래의 함수 참조를 무효화해야합니다. 경우에 따라 캐싱이 구현 될 수 있습니다 (예 : 사용자가 수정해도 그만큼 변경되지 않는 캐쉬 포함 파일 분석 결과). 시맨틱 하이라이트는 느리므로 구문 하이라이트와 보통 결합됩니다 (이클립스에서는 키워드가 즉시 강조 표시되는 반면 멤버 변수는 약간의 지연 후에 색상을 검정색에서 변경 함).

+0

귀하의 의견으로 (또는 사실에 근거하여) Syntax Highlight가 모든 단일 입력 문자에 대해 전체 파일을 다시 토큰 화하는 것은 좋지 않습니까? 메모장과 같은 편집기가 어떤 역할을하는지 궁금 할뿐입니다. – ZimZim

+0

저에게 이것은 속도와 구현의 복잡성 사이의 균형입니다. 예 : 더 똑똑한 당신이되고, 더 애매한 버그를 찾을 수 있습니다. 토큰 화는 정말 빠르기 때문에 전체 입력을 업데이트하면됩니다. 그러면 다른 언어를 지원해야 할 때 이상한 유물을 보지 않을 것입니다. 모든 키 누르기에서 강조 표시를하지 않을 수도 있습니다 (예 : 토큰 끝 ("단어"의 일부가 아닌 문자) 또는 사용자가 입력을 일시 중지 할 때까지 기다립니다. 물론 사용자 입력 경험이 영향을받지 않도록 토큰 화를 벤치 마크해야합니다. – Eugene

+0

나는 Notepad ++에 익숙하지 않다. 예를 들어 Sublime과 Vim을위한 C/C++ 확장은 libclang을 사용합니다. 이것은 일부 캐싱을 수행하지만 전체 "번역 단위"(편집 된 파일 + 포함)를 재분석합니다. – Eugene

0

나는 이것을 보지 못했지만, 강조되고있는 것에 달려 있다고 확신한다. 즉, 입력하는 로컬 영역을 기본 구문과 비교합니다. 폐쇄적 인 하이라이트가 될 때까지 파일의 끝까지 열려있는 주석을 말합니다.

관련 문제