2009-08-23 2 views
14

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

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

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

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

Редактировать (8/25): У меня получилось write down a draft the rules, поскольку, как я думаю, вещи должны обрабатываться, когда интеллектуальный отступ находится внутри комментария кода. Я, вероятно, буду работать с точки зрения C++/C# в правилах, но позже они должны быть параметризованы для аспектов других языков.

+0

@Chris: Без двух ссылок, которые я вернул, вы не можете рассказать об объеме двух функций и о том, насколько тщательно я их выдумал. –

+2

С гиперссылками это спам imho. – ChrisW

+0

@Chris: Вот почему я оставил один, но не те, которые являются только схемами кода на моем блоге. –

ответ

1

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

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

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

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

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

+3

Я изменил вопрос так или иначе (или много). У меня есть огромное время, создавая процедуру тестирования, чтобы предотвратить регрессии, пока я исправляю жуткий баг. Это значительно сложнее, чем синтаксический анализ, потому что 1) скорость имеет значение * большое время * и 2) документ почти никогда не синтаксически корректен в момент вызова Smart Indent. –

+0

+1 для «документа почти никогда не синтаксически правильно». Это действительно усложняет ситуацию. Вы все еще можете справиться с ошибкой; минимальный ремонт затрат говорит вам, что должно было быть там, а затем вы можете уменьшить проблему до красивой печати чистого дерева. –

5

руководство пользователя Emacs CC: Indentation Engine Basics.

Steve Yegge blog rant: js2-mode: a new JavaScript mode for Emacs.

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

+0

Блог Стива имеет смысл. Я полностью понимаю, откуда он. Одно замечание: в его блоге отсутствует тонна дел, которые нужно учитывать, но это, скорее всего, потому, что их слишком много. –

+0

Ну, я буду. Мое единственное утешение заключается в том, что Стив тоже считает, что было удивительно узнать, что проблема ортогональна синтаксическому анализу. :) +1 – agorenst

+0

Мое личное мнение, основанное на создании реальных инструментов, заключается в том, что «умное отступы» требует, чтобы вы разобрали код, а затем отпечаток. См. Другие ответы. –

3

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

+1

Аминь. +1 (Очевидно, мне нужно ввести 15 символов здесь, просто чтобы сказать, что я дал вам точку). –

1

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

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

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

Вот a research paper по теме (Full text PDF).

Вот what we did for prettyprinting с DMS Software Reengineering Toolkit до отпечатка АСТ, созданного крупномасштабным метапрограммированием.

+0

+1 Этот документ определенно будет полезен для документирования обобщенного поведения Smart Indent. Я действительно полагаю, что вы сильно недооцениваете трудность связать Smart Indent с любым * обычным алгоритмом синтаксического анализа. –

Смежные вопросы