6

얼마 전부터 나는 작은 장난감 언어를 처음부터 디자인 할 생각 이었지만 "Rule The World"는 아니지만 주로 운동으로 생각했습니다. 이 일을 성취하기 위해 배워야 할 것이 많다는 것을 알고 있습니다.구문 분석, 강조 표시 및 완료 사이의 관계

이 질문은 나에게 매우 흡사 한 세 가지 개념 (구문 분석, 코드 강조 및 완료)입니다. 물론 구문 분석과 ASTgen은 컴파일의 일부이며 코드 강조 표시 및 완료는 IDE의 기능에 더 가깝지만 아직 유사점과 차이점은 무엇인지 궁금합니다.

이 주제에 대해 더 많은 경험이있는 사람의 힌트가 필요합니다. 이러한 개념들간에 어떤 코드가 공유 될 수 있으며 이러한 의미에서 도움이 될 수있는 아키텍처 고려 사항은 무엇입니까?

답변

2

원하는 것은 구문 지향적 인 structure editor입니다. 이것은 파싱을 AST 빌드와 결합하고 구문 분석기를 사용하여 다음에 입력 할 수있는 내용 (구문 완성)을 예측하거나 컴파일러의 마지막 실행과 연결되므로 편집 지점을 해석하여 유효한 식별자가 무엇인지 파악할 수 있습니다 코드의 해당 시점과 마지막으로 관련이있는 컴파일러의 심볼 테이블을 검사하여 다음으로 와야합니다.

가장 어려운 부분은 사용자에게 끊김없는 경험을 제공하는 것입니다. 그녀는 거의 그녀가 텍스트를 편집하고 있다고 믿어야한다. (구조 편집자가 보여준 경험) 그녀는 그것을 어색한 것으로 받아들이지 않을 것이다.

이것은 많은 노력과 조정을 필요로하는 기계류입니다. 좋은 소식은 컴파일러에 파서가 필요하다는 것입니다. 편집도 파싱하면 컴파일러에서 필요로하는 AST가 본질적으로 사용 가능합니다. 물론 배치 컴파일에 대해서도 걱정해야합니다. 컴파일러는 기호 테이블을 작성해야합니다. 그래서 당신은 편집 완료 과정에서 그것을 사용할 수 있습니다. 더 어려운 소식은 파서가 구축하기가 훨씬 더 어렵다는 것입니다. 사용자가 볼 수있는 구문 오류를 선언하고 종료 할 수는 없습니다. 오히려 같은 순간에 존재하는 여러 가지 오류에 대해 관대해야하며 조각에 대한 부분적인 AST를 보유하고 오류가 사용자에 의해 제거되면 함께 꿰맬 수 있어야합니다.

Berkeley Harmonia 명이이 분야에서 훌륭하게 작업하고 있습니다. 문제에 대한 자세한 감각과 문제를 다루는 한 가지 접근법을 얻으려면 자신의 논문을 읽는 것이 좋습니다.

다른 주요 접근법 사람들 (특히 Intentional ProgrammingXText)은 객체 지향 편집기로 각 AST 노드에 편집 작업을 첨부하고 화면의 모든 지점을 AST 노드와 연관시킵니다. 그런 다음 편집 작업은 AST 노드 특정 동작 (문자 삽입, 오른쪽 오른쪽 이동, ...)을 호출하고 작동 방법 및 화면 수정 방법을 결정할 수 있습니다. 아마 편집자가 아무 것도 할 수 없도록 만들 수 있습니다. 그것의 조금 더 실제로 연습. 나는이 편집자들을 사용했다. 그들은 텍스트 에디터와 같은 느낌이 들지 않습니다. 열정적 인 사용자가 있지만 YMMV가 있습니다.

나는 새 에디터를 정의하려고 시도하는 것과는 달리, 그러한 에디터를 만들려는 노력 중에서 선택해야한다고 생각합니다. 두 가지 방법을 동시에 수행하면 문제가 생길 수 있습니다.

+0

답변 해 주셔서 감사합니다. 귀중한 링크를 제공하는 동안 컴파일러의 파서와 IDE의 파서 사이에 언급 한 차이점의 정도에 대한 통찰력을 아직 놓치고 있습니다. 예를 들어, IDE의 파서가 전체 코드 + 현재 행의 일부 함수로 상상할 수 있습니다. - 가능한 컴파일러는 이미 일부 컴파일러에 있습니다 (예 : gcc, 잘못된 인수 유형을 함수에 제공 할 때 제안 함). –

+1

IDE 구문 분석기는 컴파일러 파서보다 "할 일이 많다"는 의미에서 (컴파일러가 수행 할 때) * 합법적 인 * 다음에 * 가능성있는 * 다음에 어떤 것이 있는지 알아야한다. 컴파일러는 일반적으로 전혀 신경 쓰지 않습니다)."가능성"은 전체 응용 프로그램의 컨텍스트를 기반으로합니다. 대부분은 컴파일러에서 생성 된 심볼 테이블 데이터에서 비롯되며 IDE를 사용하면 틀림없이 업데이트됩니다. (GCC는 대안을주는 것은 실제로이 "probable"한 종류의 진단을하고 있습니다. 물론 도움이됩니다. 그래서 IDE에서 필요로하는 이유입니다 :) –