#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 . Это не связано с каким-либо правилом терминала.