Подтвердить что ты не робот

Документация по алгоритму Smart Indent?

Я большой поклонник документирования правильного поведения функций IDE, которые оказывают незначительное, но значительное влияние на поток кодирования - такие вещи, как автозавершение и комментирование/раскомментирование кода, которые вы, возможно, не понимаете, вы используете, но на в конце дня вы получили немного больше, чем вы могли бы сделать. Я делаю это в надежде, что другие языковые услуги, которые я должен использовать, включают функцию (-ы), впоследствии улучшая мою повседневную жизнь кодирования. "Настоящий" Smart Indent, т.е. Редактор Visual Studio 2008 С#, является одной из этих функций.

Отступ в базовом блочном коде достаточно прост и может быть взломан вместе в разумный промежуток времени достаточно хорошо, чтобы выполнить работу. С другой стороны, True Smart Indent - это, пожалуй, самая технически сложная задача, которую мне пришлось реализовать в IDE на сегодняшний день, и я реализовал свою справедливую долю. Даже полномасштабное автоматическое форматирование кода на лету проще; он просто отдает предпочтение Smart Indent для тяжелого подъема.

Я ищу обсуждения на высоком уровне алгоритмов Smart Indent общего назначения. В частности, я ищу либо исследование стратегий интеллектуального отступа, либо объективное описание всех нормальных и "крайних" случаев, которые можно было протестировать для обеспечения повторяемости результатов без ошибок. В конце концов, я "Я хотел бы предоставить как подробный рабочий процесс функциональности, конкретную основу для фактического внедрения этой функции, так и, наконец, сборку конкретной версии для этого языка и интеграцию ее в мои языковые службы.

PS: Редактор Visual Studio 2010 С# имеет несколько небольших ошибок в этой функции. Внедрив его сам, у меня есть совершенно новое уважение к работе, которую он выполняет, чтобы отполировать его.

Изменить (8/25): Мне удалось записать проект правил для того, как я думаю вещи следует обрабатывать, когда интеллектуальный отступ находится внутри комментария кода. Я, вероятно, буду работать с точки зрения С++/С# в правилах, но позже они должны быть параметризованы для аспектов других языков.

4b9b3361

Ответ 1

Руководство по режиму Emacs CC: Основы двигателя отступов.

Проповеди в блоге Steve Yegge: js2-mode: новый режим JavaScript для Emacs.

Цитата из последнего: "Удивительно, но удивительно, контринтуитивно, проблема с отступом почти полностью ортогональна синтаксическому анализу и синтаксической проверке".

Ответ 2

Волшебная поисковая фраза, которую вы ищете, может быть " pretty print".

Ответ 3

Возможно, мне что-то не хватает, но "умное отступы" будут полностью связаны в грамматической спецификации языка. Самое близкое к академическому документу, которое я смог найти после того, как немного google-fu было, по сути, другим вопросом SO, относящимся к определенному языку, здесь.

Итак, я боюсь, что не могу технически дать ответ, так как я не нашел академических документов, но как своего рода мета-ответ (к сожалению, в форме вопроса): неужели это сложнее чем разбор языка? Я использую термин "сложнее" в неопределенном смысле вычислимости/сложности, не ссылаясь на фактическое время/усилия/слезы, которые человек действительно вложил бы.

Рассмотрим: уровень отступов изменяется, по моему опыту, в определенных подклассах. Если инструкции, циклы, классы, структуры и т.д. И т.д. Все они уже обнаружены синтаксическим анализатором. Так же, как можно украсить дерево разбора, чтобы построить семантическое дерево (здесь осколок случайного университета веб-сайт), не можете ли вы вместо этого украсить дерево разбора с "информацией об отступлении"?

Думаю, я просто не понимаю, что такое призыв к академическим документам. Если, конечно, там чего-то не хватает. Это вполне возможно, поскольку я, конечно, никогда не осмеливался это сделать.:) Но, с моей точки зрения, казалось бы, что этот интеллектуальный отступ возможен просто за счет запуска модифицированного парсера, и вместо того, чтобы сообщать об ошибках синтаксического анализа, он автоматически переформатирует код так, чтобы он был действительным (если предположить, что "реальный" Парсер уже одобряет блок). Работа в реальном времени, безусловно, вызовет проблемы, и есть неопределенные уровни отступов в зависимом от пробелов языке (поскольку уровень отступа - это конец блока).

Как последнее (честно говоря, я почти закончил!:)) заметьте: редактирование текста Emacs потрясающе хорошо, по моему опыту. Я понятия не имею, как это работает, но если бы я попытался это сделать, это было бы первое место, которое я бы посмотрел... после этого, конечно.:))

Ответ 4

Как и другой ответчик, ключевая идея для этого права - довольно печатать, то есть генерации текста из абстрактной синтаксической структуры кода.

В основном вы используете вложенность дерева для создания гнездования печатного текста. Ключевыми идеями являются понятие построения примитивных строк из листьев дерева, склеивание горизонтальных коробок [прямоугольников текста] вместе с другими ящиками из подтипов для обеспечения горизонтальной композиции и склеивание коробок друг с другом, чтобы получить больше вертикальных боксов.

Трудные части: регенерирование литералов langauge с информацией о форматировании из листьев дерева (сколько же ведущих нулей сделал этот бинарный номер точки с плавающей запятой?), обработка переполнения правого запаса путем разрешения альтернативных макетов коробки и обратного отслеживания и сопоставления структурных древовидных структур с рисунком для красивой печати отдельных деревьев красивыми способами (например, вложенных if-then-if-then-if....)

Здесь исследовательский документ по теме (Полный текст PDF ).

Здесь что мы сделали для prettyprinting с DMS Software Reengineering Toolkit, чтобы отпечатать АСТ, созданные крупномасштабным метапрограммированием.