2015-08-25 3 views
2

В настоящее время я заканчиваю математическую DSL на основе кода LaTeX в Rascal. Это означает, что у меня есть много специальных символов ({,},), например, в синтаксисе, показанном ниже, сумма не выделяется, если я не удаляю \ и _ {из синтаксиса.Синтаксис Подсветка при использовании специальных символов

syntax Expression = left sum: '\\sum_{' Assignment a '}^{' Expression until '}' Expression e 

Я заметил, что ключевые слова, содержащие либо \ или {и}, не выделяются. Есть ли способ преодолеть это?

Edit: я случайно использовал данные вместо синтаксиса в этом примере

+0

Вы попробовали ответ, и он работает на вас? – jurgenv

ответ

1

Есть по крайней мере два решения, один основан на изменении грамматики, один основан на пост-синтаксического анализа обходе дерева. Выберите ваш яд :-)

Причиной поведения являются правила выделения по умолчанию, которые эвристически определяют, что выделяется «ключевое слово», путем сопоставления любого литерала с регулярным выражением [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, обязательно заверните вызов в синтаксический анализатор с помощью некоторой функции, которая выполняет этот визит.

+0

Не было ли фильтра фильтров после сеанса без упаковки? Я помню, как именовать функцию так же, как и производство? –

+0

да, но это идет только для пользовательских правил, и это генерируется. – jurgenv

+0

Спасибо Юрген, первый вариант сделал трюк на данный момент, так как мне нужно было провести несколько исследований с языком на этой неделе. Я собираюсь попытаться изменить его на третий вариант в выходные, так как мне не очень нравится этот подход. Я добавил @category = "MetaKeyword" к лексическим элементам, кстати, поскольку он не работал для синтаксических элементов. Это заставило меня добавить ключевые слова в абстрактный синтаксис как часть этих утверждений. Мне это не нравится, поэтому я собираюсь попробовать третий вариант в эти выходные. – rperz86

 Смежные вопросы

  • Нет связанных вопросов^_^