Документация по алгоритму Smart Indent? - PullRequest
15 голосов
/ 23 августа 2009

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

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

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

PS: в редакторе C # Visual Studio 2010 есть несколько небольших ошибок в этой функции. Я сам реализовал это, и у меня появилось новое уважение к работе, необходимой для его полировки.

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

Ответы [ 4 ]

5 голосов
/ 24 августа 2009

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

Блог Стива Йегге: js2-mode: новый режим JavaScript для Emacs .

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

3 голосов
/ 26 августа 2009

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

2 голосов
/ 03 сентября 2009

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

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

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

Вот исследовательская работа по теме (Полный текст PDF) .

Вот то, что мы сделали для prettyprinting с DMS Software Reingineering Toolkit , чтобы распечатать AST, сгенерированные крупномасштабным метапрограммированием.

1 голос
/ 24 августа 2009

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

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

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

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

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

...