Методы создания подсветки синтаксиса в 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. Вы можете следить за прогрессом здесь. Хотя в данный момент в проекте не упоминается подсветка синтаксиса, он стоит в нашей повестке дня.

Другие вопросы по тегам