Я пытаюсь добавить функцию завершения кода в текстовый редактор. Я думал, что могу получить от Antlr предложения по поддержке несемантического контента.
На данный момент у меня есть несколько ParserRuleContexts. Я хочу получить доступ ко всем терминальным узлам любого типа 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;
"
Вспомогательный контент должен получить квалификаторы «final» и «static» в качестве предложения.
Я использовал парсер Antlr для разбора этого предложения. А потом я понял, что курсор находится в ClassContext -> AttributeContext с помощью Visitor.
В методе visitAttributeContext я хочу получить все терминалы AttributeContext, например [public, protected, private, static, final, unique]. Затем я уберу другие квалификаторы, кроме «static, final» в соответствии с позицией курсора.
В конце концов, мой вопрос: как я могу получить все конечные узлы из любого ParserRuleContex? Или есть другой способ?
Примечание. Грамматика может быть неправильной, я придумал этот вопрос. Пожалуйста, просто просмотрите это.