частности как бы там правильно хранить комментарии
Red Green Tree - вариант из Roslyn. З.ы. мог ошибиться с названием.
Ну про комменты там ничего особенного, но как пример реализации иммутабельного двунаправленного (!) дерева - очень классное решение
Можно их тупо "подвешивать" (как node вроде <comment text>) в дереве прямо туда, где они встретятся. А при обработке игнорировать такие nodes (в большинстве случаев). Впрочем, это зависит от того, зачем это нужно (что надо будет потом делать с этим CST), мне кажется...
Не очень понятно что значит "подвешивать"
Как-то так: assignment --------- / | \ \ / | \ \ x = comment expression---------------...-------- /*zzz*/ | \ \ expression------------- + \ / | \ \ \ d y comment + comment c /*aaa*/ /*bbb*/ (мне надоело "рисовать")
Т.е. условно говоря в каждой ноде иметь N коллекций комментариев. Это конечно можно, но как-то жестко, я рассчитывал на что-то более элегантное
Хмм... в смысле "N коллекций" — вон там просто <comment nodes> развешаны в произвольных местах, и всё. Остаётся их только игнорировать в большинстве случаев при обработке. Но, опять-таки — зависит от того, что нужно.
Это если у вас нода не типизированная, т.е. дети представляются в виде списка произвольных нодов
К токенам можно "клеить" ещё, например (где-то я такое видел). Т.е. у любого token может быть ссылка на список (следующих за ним, либо предшествующих — от языка и ситуации зависит) комментариев. Тогда CST выглядит так, как будто их там нет.
Да, это однин из вариантов решения. Я думал можно что-то более красивое найти :)
А смотрели tree-sitter и ANTLR (я сходу не помню, какие там решения... в последнем, вроде, independent comments stream)?
Но при преобразованиях всё равно нужно вспоминать, что они там есть.
Можно типизированную, просто комменты это тип any
Ну, тут математика ограничивает. Есть набор нод и отношения между ними заданные правилом разбора, а когда между нодами встречается коммент, логично его привязать к ребру. Однако, граф можно как бы вывернуть на изнанку - преобразовать в двойственный граф, тогда ребра станут вершинами, а вершины ребрами
Про выворачивание не очень понял. Можно пример?
Вывернутый граф тоже дерево?
Да, все просто: https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B0%D1%84
Чет не понятно как это к синтаксическим деревьям относится
Да, не правильно мысль прошла 😁
cst это дерево токенов комментарии можно прикручивать к токенам, но не ясно правда вперед или назад
Есть ещё языки с интересными схемами комментариев, где они бывают вложенными (типа /* /* */ */). Уж не знаю, а ваша схема это учитывает, и нужно ли ей это или нет.
Вложенные комментарии — по-прежнему один комментарий, нет? Т.е. это несущественно, по идее...
Таким комментам место исключительно в сатанинских скрижалях
Но и эти скрижали нужно кому-то парсить!
Да ладно: это получантся при необходимости закоментировать фрагмент исходного кода
Нет, это база, ты крч берёшь любой кусок кода и оборачиваешь в блок коммент и тебя ничто не остановит. Если вложенных комментариев нет, то с шансом твой маневр оборачивания ненужного кода сломается, потому что внутри был другой блок коммент.
Получается, Pascal — сатанинские скрижали
Ух: минутка "чистой ненависти"?.. ВУЗ / Школа + УПК ?
Просто напоминание, что там комментарии можно вкладывать
В Turbo Pascal - скорее всего, было нельзя.
И зачем вам Паскаль-69, если есть Паскаль-79, 85 или 89?
Это из документации к 3.0 85 года
Ок: хотел как раз это спросить. Т.е. можно так: { (* *) } но не иначе... ( так прочёл - солнце не способствует; блики)
Иметь два синтаксиса для комментариев, которые можно вкладывать только друг в друга, но не в самих себя - это хрестоматийное определение сатанинских скрижалей
Хотел сказать, что это не позволяет делать произвольную вложенность, но уже не уверен
А в Modula-2 ? ( это и есть Pascal-79 ) В Modula-3 точно ( 99/100 , в пнд. уточню, если вспомню) можно: (* (* Тра-ля-ля *) *)
Это был 85 год, они развлекались как могли
Позволяет. Но если применять фигурные скобки только для временного закомментирования. Вообще-то, ещё можно вот так: (* * Эмуляция комметнтариев Ada *)
Вот я кстати тоже думал, что вкладывание комментариев сразу так работало. Пока не посмотрел в документацию
Забавно, что в в DEC к декабрю 1988 справились с задачей
А я "нарвался" в энской лабораторной Ж-) Практически...
Даже тогда сделать нормально было несложно.
Я на свою голову полистал исходные коды Turbo Pascal ... Лучше бы я этого не делал. Но: оно же работало. И весьма неплохо. Хотя TopSpeed был заметно лучше
Да ладно :) Я во все свои разработки заношу вложенные комментарии. Это ж, как минимум, удобно...
В ANTLR есть разные каналы, но токены из них не клеятся к дереву - это нужно делать самостоятельно.
Обсуждают сегодня