코드 완성 기능을 텍스트 편집기에 추가하려고합니다. 나는 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에서 모든 터미널 노드를 얻을 수 있습니까? 아니면 다른 방법이 있습니까?
참고 : 문법이 잘못되었을 수 있습니다.이 질문을 위해 발명했습니다. 제발 그걸 훑어 보렴.
그 전에는 답장을 보내 주셔서 죄송합니다. 그리고 당신의 대답에 감사드립니다. [Tomassetti] (https://tomassetti.me/autocompletion-editor-antlr/) 예제와 [yours] (http://www.soft-gems.net/index.php/tools/47- 보편적 인 코드 완성 - antlr). 내 연구에 따르면,이 작업을 수행하는 몇 가지 방법이 있습니다. 하지만 유일한 일반적인 방법은 ATN을 걷는 것 같습니다. 지금은 다른 방법을 사용하고 있지만 언급 한 일반적인 방법을 사용하겠습니다. 다시 한 번 감사드립니다. 친애하는. –
그 동안 나는 더 많은 아이디어를 줄 수있는 [C3 (Code Completion Core)] (https://www.npmjs.com/package/antlr4-c3) 엔진을 발행했습니다. –