Есть по крайней мере два решения, один основан на изменении грамматики, один основан на пост-синтаксического анализа обходе дерева. Выберите ваш яд :-)
Причиной поведения являются правила выделения по умолчанию, которые эвристически определяют, что выделяется «ключевое слово», путем сопоставления любого литерала с регулярным выражением [A-Za-z][A-Za-z0-9\-]*
. Рядом с этими эвристическими значениями по умолчанию подсветка полностью программируется с помощью тегов @ category в грамматике и аннотация @category в дереве разбора.
Если изменить грамматику, как это так, вы можете влиять на выделение с помощью тегов:
data Expression = left sum: SumKw Assignment a '}^{' Expression until '}' Expression e
data SymKw = @category="MetaKeyword" '\\sum_{';
Или, другая грамматика на основе решение разделить определение вверх (который не является языком с сохранением грамматики рефакторинга поскольку оно добавляет возможность пробелов):
data Expression = left sum: "\\" 'sum' "_{" Assignment a '}^{' Expression until '}' Expression e
(Последнее решение будет инициировать эвристики для ключевых слов снова)
Если вы не любите взломать грамматику для размещения на первый план, другой способ, чтобы добавить аннотацию через обходе дерева, например, так:
visit(yourTree) {
case t:appl(prod(cilit("\\sum_{"),_,_),_) => t[@category="MetaKeyword"]
}
код несколько волосатые, потому что вы должны соответствовать и замените дерево, которое обычно может быть проигнорирован думая о своем родном языке. Это понятие правила синтаксиса, сгенерированного для каждого (нечувствительного к регистру) литерала, и его приложение к отдельным персонажам, из которых он состоит. См. ParseTree.rsc
из стандартной библиотеки для подробного и формального определения того, что деревья синтаксического анализа выглядят как под капотом.
Чтобы последнее решение получило эффект, когда вы создаете экземпляр среды IDE с помощью функции registerLanguage
от util::IDE
, обязательно заверните вызов в синтаксический анализатор с помощью некоторой функции, которая выполняет этот визит.
Вы попробовали ответ, и он работает на вас? – jurgenv