Как сделать подсветку синтаксиса для правил терминала в Xtext?

#syntax-highlighting #dsl #xtext

#подсветка синтаксиса #dsl #xtext

Вопрос:

Я хотел бы сделать пользовательскую подсветку синтаксиса в xtext. Я хотел бы выделить все, что соответствует правилу терминала, определенным цветом.

Например, мое правило терминала:

 terminal MYRULE:
    ('ab'|'2')*
;
 

Я хотел бы раскрасить все, как комментарий, что соответствует этому правилу терминала.

Я устал от следующего:

 package org.xtext.example.mydsl.ui;

import java.util.regex.Pattern;

import org.eclipse.xtext.ide.editor.syntaxcoloring.HighlightingStyles;
import org.eclipse.xtext.ui.editor.syntaxcoloring.DefaultAntlrTokenToAttributeIdMapper;

public class STAntlrTokenToAttributeIdMapper extends DefaultAntlrTokenToAttributeIdMapper {

private static final Pattern QUOTED = Pattern.compile("(?:^'([^']*)'$)|(?:^"([^"]*)")$", Pattern.MULTILINE);
    
    private static final Pattern PUNCTUATION = Pattern.compile("\p{Punct}*");
    
    @Override
    protected String calculateId(String tokenName, int tokenType) {
        
        System.out.println("token = "   tokenName);
        
        
        if ("MYRULE".equals(tokenName)) {
            return HighlightingStyles.COMMENT_ID;
        }
        
        if(QUOTED.matcher(tokenName).matches()) {
            return HighlightingStyles.KEYWORD_ID;
        }
        if("RULE_STRING".equals(tokenName)) {
            return HighlightingStyles.STRING_ID;
        }
        if("RULE_INT".equals(tokenName)) {
            return HighlightingStyles.NUMBER_ID;
        }
        if("RULE_ML_COMMENT".equals(tokenName) || "RULE_SL_COMMENT".equals(tokenName)) {
            return HighlightingStyles.COMMENT_ID;
        }
        
        
        
        return HighlightingStyles.DEFAULT_ID;
    }
 

}

Я вижу надпись «MYRULE». Код принят из редактора. Но специальная часть кода не выделена.

Конечно, это правило — всего лишь пример, а не часть DLS, над которым я работаю. Но я не могу рассказать подробности о моем DSL.

Комментарии:

1. я не понимаю цитируемый материал. и не должно ли это быть RULE_MYRULE вместо MYRULE

2. кроме того, вы можете изучить семантическую подсветку

3. С помощью quted-кода я попытался установить связь между правилом и цветом. Например, код по умолчанию, написанный не мной, гласит: «однострочный комментарий должен быть выделен стилем ‘comment_id'». Хорошо, я пропустил соглашения об именах с MYRULE. В символической подсветке они выполняют: if (node.getGrammarElement() экземпляр перекрестной ссылки) { Но это не работает для правил терминала. Не определен класс, с помощью которого я мог бы проверить instanceof. Итак, мой вопрос в том, как я могу определить основные правила выделения?

4. вы можете взглянуть на элементы грамматики узлов и связать их с правилами / вызовами правил

5. Если я перебираю узлы в корне INode = resource.getParseResult().getRootNode(); и напечатать node.getGrammarElement() Я получаю такие вещи, как org.eclipse.xtext.impl.RuleCallImpl@20a74990 . Это не связано с каким-либо правилом терминала.