Синтаксис раскраски моего DSL в Xtext
Я делаю небольшое академическое задание, в котором я должен реализовать плагин eclipse для языка NuSMV (язык проверки модели) с использованием Xtext. Была предоставлена грамматика xtext (с некоторыми незначительными ошибками). Я создал проект Xtext и назвал его "smv.project" с именем языка "NuSMV" и расширением "*.smv". Я скопировал предоставленную грамматику Xtext в smv.project/src/NuSMV.xtext, сгенерировал артефакты и создал затмение во время выполнения. Кажется, работает нормально, за исключением тех мелких ошибок (которые, по моему мнению, возникли в грамматике).
Теперь мой следующий шаг - изменить цвета по умолчанию в моем DSL. Очевидно, что каждый пользователь может сделать это для себя в меню eclipse при использовании моего плагина, но я изменю цвет DEFAULT. Я прочитал документацию Xtext для окраски синтаксиса. Это было коротко и было много терминов, которые я не понимал. Что я действительно понял, так это то, что в Xtext есть 2 вида окраски синтаксиса: Lexical и Semantic. Я не понимал значения каждого из них, но мне показалось, что лексическая раскраска проще, поэтому я пошел на это. В документации сказано, что я должен реализовать интерфейс IHighlightingConfiguration. Он показал пример реализации под названием DefaultHighlightingConfiguration (полный исходный код можно посмотреть здесь https://github.com/eclipse/xtext/blob/master/plugins/org.eclipse.xtext.ui/src/org/eclipse/xtext/ui/editor/syntaxcoloring/DefaultHighlightingConfiguration.java). Я включил эту реализацию в свой проект, в smv.project.ui/src/smv.project.ui.editor.syntaxcoloring. Конечно, я изменил строку "пакет" в начале файла. Я изменил все красные значения на 255, чтобы увидеть разницу. Я снова сгенерировал артефакты, создал затмение во время выполнения, создал файл *.smv, но цвета были такими же.
Я предположил, что мне нужно установить свой новый класс в некоторой переменной или классе конфигурации... Я попытался найти "DefaultHighlightingConfiguration" в репозитории примера и обнаружил, что он используется в файле XtextProposalProvider.java (полный исходный код https://github.com/eclipse/xtext/blob/87a6c7dc25074ca4ff28429c059e728ef420b926/plugins/org.eclipse.xtext.xtext.ui/src/org/eclipse/xtext/ui/contentassist/XtextProposalProvider.java). Итак, я пошел в уже существующий NuSMVProposalProvider.java в своем хранилище и попытался добавить те же строки:
@Override
protected StyledString getKeywordDisplayString(Keyword keyword) {
return stylerFactory.createFromXtextStyle(keyword.getValue(),
defaultLexicalHighlightingConfiguration.keywordTextStyle());
}
Вот мой полный NuSMVProposalProvider.xtend:
/*
* generated by Xtext
*/
package smv.project.ui.contentassist
import smv.project.ui.contentassist.AbstractNuSMVProposalProvider
import javax.inject.Inject
import org.eclipse.xtext.ui.editor.syntaxcoloring.DefaultHighlightingConfiguration
import org.eclipse.jface.viewers.StyledString
import org.eclipse.xtext.Keyword
/**
* see http://www.eclipse.org/Xtext/documentation.html#contentAssist on how to customize content assistant
*/
class NuSMVProposalProvider extends AbstractNuSMVProposalProvider {
@Inject
private DefaultHighlightingConfiguration defaultLexicalHighlightingConfiguration;
@Override
protected StyledString getKeywordDisplayString(Keyword keyword) {
return stylerFactory.createFromXtextStyle(keyword.getValue(),
defaultLexicalHighlightingConfiguration.keywordTextStyle());
}
}
Однако появились следующие ошибки:
- "Аннотация @Override запрещена для этого местоположения".
- "посторонний ввод" ключевое слово "ожидание") "
- msgstr "несоответствующий ввод" {'ожидание'=>'"в первых 3 строках соответственно.
Мои вопросы:
- Что именно я должен делать с моим классом, который реализует IHighlightingConfiguration?
- Что такое лексическая и семантическая подсветка?
- Есть ли что-то еще, что мне нужно знать, чтобы моя синтаксическая раскраска работала?
Большое спасибо!!:) Чай
1 ответ
NuSMVProposalProvider не был подходящим способом. Мне не нужно было добавлять код там вообще. Я искал добавление следующих строк в NuSMVUiModule.java:
public Class<? extends IHighlightingConfiguration> bindIHighlightingConfiguration () {
return DefaultHighlightingConfiguration.class;
}
Спасибо всем за их комментарии! Chai