Методы создания подсветки синтаксиса в textX?
Поскольку я не могу найти какие-либо рекомендации по подсветке синтаксиса, я решил подготовить простой предварительный просмотр записи в виде обычного текста и затем подсветки всего в html, что достаточно для моей области на данный момент.
Переопределив многие пользовательские классы метамодели, я имею to_source
метод, который фактически переопределяет весь синтаксис в обратном порядке, так как обратный анализ еще не доступен. Это нормально, но игнорирует пользовательское форматирование.
Для сохранения пользовательского форматирования мы можем использовать только доступную вещь: _tx_position
а также _tx_position_end
, Переход от основного правила textX к его дочерним элементам с помощью сохраненных пользовательских атрибутов классов метамодели работает в большинстве случаев, но это не удается примитивами.
# textX meta-model file
NonsenseProgram:
"begin" foo=Foo "," count=INT "end";
;
Foo:
"fancy" a=ID "separator" b=ID "finished"
;
# textX custom meta-model classes
class NonsenseProgram():
def __init__(foo, count):
self.foo = foo
self.count = count
def to_source(self):
pass # some recursive magic that use _tx_position and _tx_position_end
class Foo():
def __init__(parent, a, b):
self.parent = parent
self.a = a
self.b = b
def to_source(self):
pass # some recursive magic that use _tx_position and _tx_position_end
Давайте рассмотрим приведенный пример. Как у нас NonsenseProgram
а также Foo
классы, которые мы можем переопределить, мы контролируем его возвращаемый источник в целом. Мы можем изменить NonsenseProgram
сгенерированный код, NonsenseProgram.foo
фрагмент (переопределением Foo
), получив доступ к его _tx_*
атрибутов. Мы не можем сделать то же самое с NonsenseProgram.count
, Foo.a
а также Foo.b
как у нас примитивно string
или же int
значение.
В зависимости от использования примитивов выходит из грамматики у нас есть следующие варианты:
- Оберните каждый примитив правилом, которое содержит только этот примитив и ничего больше.
Плюсы: это работает прямо сейчас!
Минусы: создает огромные накладные расходы на вложенные значения, которые должен обрабатывать наш набор грамматических инструментов. Это на самом деле портит грамматику только за то, что она красивая... - Игнорировать синтаксис от пользователя и использовать только наши правила обратного анализа.
Плюсы: это тоже работает!
Минусы: вам нужно переопределить ваш синтаксис почти с каждым элементом грамматики. Это заставляет переформатировать код при каждой попытке подсветки. - Используйте некоторые внешние правила выделения.
Плюсы: это будет работать...
Минусы: опять грамматика переопределение. - Используйте языковой сервер.
Плюсы: будет лучшим вариантом в долгосрочной перспективе.
Минусы: упоминается только один раз без каких-либо подробных документов.
Любые предложения о каких-либо других вариантах?
1 ответ
Вы правы. Нет информации о позиции для примитивных типов. Похоже, что вы рассмотрели доступные варианты на данный момент.
То, что было бы легко реализовать, - это добавить учет положения непосредственно к textX всех атрибутов в виде специальной структуры для каждого созданного объекта (например, dict с ключом имени атрибута). Это должно быть легко реализовано, чтобы вы могли зарегистрировать запрос функции в трекере ошибок, если хотите.
В прошлом была некоторая работа по поддержке полноязычных сервисов для языков на основе textX. Идея состоит в том, чтобы получить все функции, которые вы ожидаете от приличного редактора кода /IDE для любого языка, указанного с использованием textX. Работа на некоторое время замерла, но недавно возобновилась как полная перезапись. Должно быть официально поддержано командой textX. Вы можете следить за прогрессом здесь. Хотя в данный момент в проекте не упоминается подсветка синтаксиса, он стоит в нашей повестке дня.