Написание инструмента форматирования кода для языка программирования - PullRequest
8 голосов
/ 07 июня 2011

Я изучаю возможность написания инструмента форматирования кода для языка Apex, варианта Salesforce.com для Java и perhams VisualForce, его языка разметки на основе тегов.

Понятия не имеюс чего начать, кроме ощущения / знания того, что написание синтаксического анализатора языка с нуля, вероятно, не лучший подход.

У меня довольно слабое понимание того, что такое Antlr и что он делает, но концептуально я "Я представляю, что можно «обучить» antlr понимать синтаксис Apex.Затем я мог бы получить структурированную версию кода в структуре данных (AST?), Которую затем мог бы использовать для получения правильно отформатированного кода.

Это правильная концепция?Является ли Antlr инструментом для этого?Есть ли ссылки на краткий обзор этого?Я ищу потратить несколько дней на эту задачу, а не месяцы, и я не уверен, выполнимо ли это даже смутно.

Ответы [ 4 ]

2 голосов
/ 07 июня 2011

Поскольку синтаксис Apex похож на Java, я бы посмотрел на JDT в Eclipse. Измените грамматику Java, чтобы она соответствовала Apex. Сделайте то же самое с правилами / параметрами форматирования. Это больше, чем несколько дней работы.

2 голосов
/ 07 июня 2011

Стивен Ирод писал:

... Я представляю, что можно научить antlr понимать синтаксис Apex....

Что вы подразумеваете под "train 'antlr" ?«Тренируйся» как в искусственном интеллекте (тренируй нейронную сеть)?Если это так, то вы ошибаетесь.

Стивен Ирод писал:

... получить структурированную версию кода вструктура данных (AST?), которую я мог бы затем использовать для получения правильно отформатированного кода.

Это правильная концепция?Является ли Antlr инструментом для этого?

Да, более или менее.Вы пишете грамматику, которая точно определяет язык, который вы хотите проанализировать.Затем вы используете ANTLR, который сгенерирует лексер (токенизатор) и парсер на основе файла грамматики.Вы можете позволить синтаксическому анализатору создать AST из вашего входного источника, а затем пройти AST и генерировать (пользовательский) вывод / код.

Стивен Ирод писал:

... Я ищу потратить несколько дней на это задание, а не месяцы, и я не уверен, что это даже смутно достижимо.

Ну, яконечно, я вас не знаю, но я бы сказал, что написание грамматики для языка, похожего на Java, а затем вывод результата путем обхода AST всего за пару дней невозможен, тем более для кого-то новичка в ANTLR.Я довольно хорошо знаком с ANTLR, но я не смог сделать это всего за несколько дней.Обратите внимание, что я говорю только о «синтаксической части», после того, как вы это сделаете, вам нужно будет интегрировать это в некоторый текстовый редактор.Все это выглядит как проект, рассчитанный на несколько месяцев, а не недель, не говоря уже о нескольких днях.

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

Вы можете взглянуть на Xtext , который использует ANTLR под капотом.Процитируем их сайт:

С Xtext вы можете легко создавать свои собственные языки программирования и доменные языки (DSL).Фреймворк поддерживает разработку языковых инфраструктур, включая компиляторы и интерпретаторы, а также полноценную интеграцию IDE на основе Eclipse....

Но я сомневаюсь, что плагин Eclipse будет запущен через несколько дней.

В любом случае, удачи!

0 голосов
/ 24 марта 2016

Обратный инжиниринг языка для получения парсера - это сложно. Очень сложно! Даже если это очень близко к Java.

Но зачем изобретать велосипед?

Существует замечательная реализация синтаксического анализатора Apex как часть IDE Force.com на GitHub. Это просто баночка без исходного кода, но вы можете использовать ее для чего угодно. И разработчики, стоящие за этим, действительно поддерживают и помогают .

В настоящее время мы создаем модуль Apex из известного известного статического анализатора кода Java PMD . И мы используем внутренний анализатор Salesforce.com. Отлично работает.

И, эй, это проект с открытым исходным кодом, и нам нужны вкладчики любого вида; -)

0 голосов
/ 07 июня 2011

Наш набор инструментов для реинжиниринга программного обеспечения DMS разработан для того, чтобы делать это как любезный покерный анте, необходимый для любого проекта автоматизированного реинжиниринга программного обеспечения.

DMS позволяет определять грамматику,похож на стили ANTLR (и другого генератора парсера).В отличие от ANTLR (и других генераторов синтаксического анализатора), DMS использует синтаксический анализатор GLR, что означает, что вам не нужно изменять правила грамматики языка для соответствия требованиям генератора синтаксического анализатора.Если вы можете написать грамматику без контекста, DMS преобразует ее в синтаксический анализатор для этого языка.Фактически это означает, что вы можете получить рабочую правильную грамматику значительно быстрее, чем с обычными генераторами синтаксического анализатора LL или L (AL) R.

В отличие от ANTLR (и других генераторов синтаксического анализатора), нет никакой дополнительной работы по созданию AST;это автоматически построено.Это означает, что вы тратите ноль времени на написание правил построения дерева, а не на их отладку.

DMS дополнительно предоставляет симпатичный язык спецификации печати, задающий стек текстовых полей по вертикали, горизонтали или с отступом, в котором вы можете определить «формат», который используется для полного преобразования AST в полностью легальный, красиво отформатированный исходный текст.Ни один из известных генераторов синтаксического анализатора здесь не помогает;если вы хотите красиво распечатать дерево, вы можете выполнить множество пользовательских программ.Подробнее об этом см. Мой SO-ответ на Компиляция AST обратно к источнику .Это означает, что вы можете создать симпатичный принтер для вашей грамматики в (интенсивный) день, просто аннотируя правила грамматики с помощью директив макета блока.

Лексер DMS очень тщательно собирает комментарии и «лексические форматы» (это было восьмеричное число? Какие цитаты были в этой строке? Экранированные символы?), Чтобы их можно было правильно перегенерировать.Анализ синтаксического анализа в AST и затем Prettyprint-AST-to-text позволяет произвольно отображать некрасивый код в отформатированный код, следуя правилам prettyprinting.(Этот круговой ход - покерный анте: если вы хотите пойти дальше, чтобы фактически манипулировать AST, вы все равно хотите иметь возможность восстановить действительный исходный текст).

Недавно мы создали парсер / prettyprinters для EGL.Это заняло около недели до конца.Конечно, мы являемся экспертами в наших инструментах.

Вы можете загрузить любой из различных форматеров, созданных с использованием DMS, с нашего веб-сайта, чтобы увидеть, на что способно такое форматирование.

РЕДАКТИРОВАТЬ Июль 2012: Последняя неделя (5 дней) с использованием DMS. С нуля мы (лично я) создали полностью совместимый с IEC61131-3 синтаксический анализатор структурированного текста (язык промышленного управления, Pascal-подобный) и prettyprinter.(Он обрабатывает все примеры из документов стандартов).

...