2017-02-07 9 views
1

코드 완성 기능을 텍스트 편집기에 추가하려고합니다. 나는 Antlr으로부터 비 의미 론적 콘텐츠 보조 제안을 얻을 수 있다고 생각했다.ParserRuleContext의 모든 예상 토큰 얻기

이 시점에서 필자는 여러 개의 ParserRuleContext를 가지고 있습니다. 모든 유형의 ParserRuleContext의 모든 터미널 노드에 접근하려고합니다.

예를 들어 아래와 같은 bnf가 있습니다.

class 
'class' name = IDENTIFIER '{' 
attribute* 
'}' 
; 

attribute 
(qualifier += 'public' 
| qualifier += 'protected' 
| qualifier += 'private')? 
(qualifier += 'static')? 
(qualifier += 'final')? 
'attribute' name = IDENTIFIER ':' type = IDENTIFIER 
('(' qualifier += 'unique' ')')? 
; 

IDENTIFIER : LETTER (LETTER|DIGIT)*; 
LETTER : [a-zA-Z]; 
DIGIT : [0-9]; 

내가 편집기에 기록 된 문장을 가지고 : 사용자가 아래의 인덱스로 커서를 이동하고 싶어 할 때

class CLAZZ { public attribute SOMETHING : String; }

콘텐츠는 지원 :

" public [cursor] attribute SOMETHING : String; "

콘텐츠 지원은 '최종'및 '정적'한정자를 제안서로 사용해야합니다.

필자는 Antlr 구문 분석기를 사용하여이 문장을 구문 분석했습니다. 그리고 커서가 Visitor를 사용하여 ClassContext -> AttributeContext에 있다는 것을 알았습니다.

visitAttributeContext 메소드에서 [public, protected, private, static, final, unique]과 같은 AttributeContext의 모든 터미널을 가져 오려고합니다. 그런 다음 커서 위치에 따라 '정적, 최종'을 제외한 다른 한정자를 제거합니다.

궁극적으로 내 질문은, 어떻게 모든 ParserRuleContex에서 모든 터미널 노드를 얻을 수 있습니까? 아니면 다른 방법이 있습니까?

참고 : 문법이 잘못되었을 수 있습니다.이 질문을 위해 발명했습니다. 제발 그걸 훑어 보렴.

답변

0

"코드 완성"이라는 용어로 더 잘 알려진 "ContentAssist"의 구현은 간단하지 않은 작업이므로 ANTLR (적어도 atm)의 내부 클래스를 깊이 파고 들어야 할 수도 있습니다. 당신이해야 할 일은 파서와 렉서 클래스 각각에 대해 ANTLR에 의해 생성 된 ATN을 걷는 것입니다. 이를 수행하는 한 가지 방법은 블로그 게시물 Building autocompletion for an editor based on ANTLR에 설명되어 있습니다. 유사한 접근법이 AN1R 런타임의 클래스 인 LL1Analyzer에 의해 사용됩니다.

그러나 둘 다 렉서 토큰 만 제공 할 수 있습니다 (예 : 모든 키워드 + IDENTIFIER 또는 DIGIT와 같은 다른 키워드). 즉, 예를 들어 얻지 못할 것입니다. 변수 참조 등을 포함 할 수있다.

+0

그 전에는 답장을 보내 주셔서 죄송합니다. 그리고 당신의 대답에 감사드립니다. [Tomassetti] (https://tomassetti.me/autocompletion-editor-antlr/) 예제와 [yours] (http://www.soft-gems.net/index.php/tools/47- 보편적 인 코드 완성 - antlr). 내 연구에 따르면,이 작업을 수행하는 몇 가지 방법이 있습니다. 하지만 유일한 일반적인 방법은 ATN을 걷는 것 같습니다. 지금은 다른 방법을 사용하고 있지만 언급 한 일반적인 방법을 사용하겠습니다. 다시 한 번 감사드립니다. 친애하는. –

+0

그 동안 나는 더 많은 아이디어를 줄 수있는 [C3 (Code Completion Core)] (https://www.npmjs.com/package/antlr4-c3) 엔진을 발행했습니다. –