ANTLR4 - Генерировать код из нефайловых входов?

С чего начать вручную создавать CST с нуля? Или ANTLR4 всегда требует, чтобы процесс lex / parse был нашим входным шагом?

В моей программе есть некоторые визуальные элементы, представляющие структуры кода.

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

Теперь я хочу превратить их в код. Как мне использовать ANTLR4 для этого во время выполнения (используя ANTLR4.js)? Большинство примеров ANTLR, похоже, полагаются на лексирование и синтаксический анализ существующего кода, чтобы добраться до синтаксического дерева. Так что, а не:

input code->lex->parse->syntax tree->output code (1)

я хочу

manually create syntax tree->output code (2)

(Позже, когда пользователь добавит код в этот класс и его методы, ANTLR будет использоваться, как в (1).)

ИЗМЕНИТЬ. Возможно, я неправильно понимаю это. Могу ли я создать некоторую настраиваемую структуру данных, а затем запустить ее анализатор? т.е. write structures to some in-memory format->parse->output code (3)?


person Engineer    schedule 17.04.2016    source источник
comment
ANTLR4 не создает никаких AST, он может только создавать CST. Если вы хотите создать CST самостоятельно, что именно вам мешает?   -  person Lucas Trzesniewski    schedule 17.04.2016
comment
@LucasTrzesniewski Извините, я новичок в этом. Под CST я предполагаю, что вы имеете в виду то, что ANTLR называет деревом синтаксического анализа. Я хотел AST, потому что это позволило бы мне использовать одно и то же дерево исходного кода для чтения / записи исходного кода на 2 языках (C и JS). Но мне они не нужны одновременно ... один проект будет написан в одном или другом ... так что ничто не мешает мне читать, какой бы источник для текущего проекта ни находился в ( C или JS), а затем выведите соответствующий результат.   -  person Engineer    schedule 17.04.2016
comment
@LucasTrzesniewski Могу ли я с уверенностью предположить, что нет способа вручную построить дерево в ANTLR4 (в отличие от 3)? И поэтому вместо этого мы должны lex / parse некоторый поток байтов, чтобы построить его?   -  person Engineer    schedule 17.04.2016
comment
Да, конкретное синтаксическое дерево - это просто синоним дерева синтаксического анализа. Если вам нужен AST с ANTLR4, вам придется создать его самостоятельно, но это довольно просто, я написал об этом сообщение здесь. И если вы хотите оставаться на уровне CST, ничто не мешает вам построить его самостоятельно, это именно то, что ANTLR делает под капотом. :)   -  person Lucas Trzesniewski    schedule 17.04.2016
comment
@LucasTrzesniewski Большое спасибо за пример CST- ›AST, это будет полезно. Можете ли вы дать мне указание, с чего начать, если хотите вручную создать CST? Или мы всегда используем процесс lex / parse в качестве шага ввода? Я не понимаю, требует ли ANTLR4, чтобы кто-то всегда участвовал в процессе синтаксического анализа, даже если кто-то хочет только построить совершенно новые структуры (то есть еще нет входных файлов). Как только я это узнаю, я могу принять ответ.   -  person Engineer    schedule 17.04.2016
comment
Я никогда не использовал версию JS, но в основном на других языках вы можете просто создать экземпляры соответствующих классов и заполнить их свойства, ничто не мешает вам это сделать. Возможно, я что-то неправильно понял в вашем вопросе.   -  person Lucas Trzesniewski    schedule 17.04.2016
comment
@LucasTrzesniewski Вы попали в точку. Версия JS функционально идентична остальным, AFAIK. Соответствующие классы - это то, что я ищу (будучи новичком во всем этом). Я не думаю, что есть какие-то канонические примеры того, как это было сделано в v4. Мне, вероятно, придется перепроектировать ParseTree и посмотреть на исходный код парсера, чтобы понять, что происходит / как создать свой собственный. Надеялся, что кто-нибудь избавит меня от неприятностей.   -  person Engineer    schedule 17.04.2016
comment
Один из уроков генераторов парсеров заключается в том, что они не предоставляют полного набора поддержки для управления исходным кодом. Например, с ANTLR, если вам нужен произвольный CST, вы должны создать его самостоятельно. Если вы сделаете это совсем немного, это не будет большой проблемой. Если вы собираетесь много заниматься построением и компоновкой деревьев, инструменты генератора синтаксического анализатора вам не помогут. Другие инструменты (их очень мало) предлагают вам средства для создания произвольных AST / CST непосредственно из спецификаций шаблонов и позволят вам легко составлять / комбинировать их или использовать для сопоставления с образцом. ...   -  person Ira Baxter    schedule 17.04.2016
comment
... надеялся, что кто-то может избавить меня от проблемы ... В качестве примера см. мой язык сопоставления шаблонов инструментов: semdesigns.com/Products/DMS/DMSRewriteRules.html   -  person Ira Baxter    schedule 17.04.2016
comment
Вы можете найти это обсуждение AST / CST полезным: stackoverflow.com/q/1888854/120163 У вас есть еще одна проблема, о которой вы не знали еще не упомянуто: учитывая собранный AST / CST, как вы собираетесь вернуть действительный текст? См. Этот ответ о том, как использовать prettyprint: stackoverflow.com/questions/5832412/   -  person Ira Baxter    schedule 17.04.2016
comment
@ArcaneEngineer да, под соответствующими классами я имею в виду узлы CST, которые ANTLR генерирует для вас, и просмотр сгенерированного исходного кода парсера даст вам представление о том, как они создаются. Как говорит Ира, ANTLR - это генератор парсеров, а не полный набор инструментов, поэтому, если вы хотите сгенерировать исходный код из CST, вам, вероятно, придется самому написать посетителя, выводящего код. Хотя вы можете иметь возможность записать CST обратно в исходную форму, если вы изменили его, вы можете получить неправильные результаты (например, вам нужно будет вставить дополнительные узлы скобок, чтобы обеспечить правильный приоритет операторов).   -  person Lucas Trzesniewski    schedule 17.04.2016
comment
Иногда нужно задать совершенно неправильные вопросы, прежде чем можно будет задать правильные. Я не говорю, что не буду использовать ANTLR, если у меня нет другого выбора, но есть ли что-нибудь, что не стоит сотни / тысячи долларов, что может сделать все эти вещи, которые мне нужны?   -  person Engineer    schedule 17.04.2016
comment
Ответ простой - нет (хотя меня обвинят в предвзятости). Генераторов парсеров просто недостаточно. См. «Жизнь после анализа»: semdesigns.com/Products/DMS/LifeAfterParsing.html   -  person Ira Baxter    schedule 17.04.2016
comment
@IraBaxter Я мог бы просто согласиться с этими людьми;) Я думаю, что ANTLR может почти достичь того, чего я хочу, учитывая его шаблоны генерации кода и текст, который он хранит в узлах ParseTree, которые можно использовать для восстановления в форме, близкой к исходной. В сочетании с вашим красивым печатным ответом, я думаю, можно было бы добиться хорошего прогресса. О, я не сомневаюсь, что на пути будет много ухабов, но это выглядит отдаленно выполнимым. Может быть.   -  person Engineer    schedule 17.04.2016
comment
Нет сомнений в том, могут ли люди построить свою собственную инфраструктуру с достаточным энтузиазмом и временем; это именно то, чем я занимался более 20 лет. На практике случается, что им не хватает и того, и другого, и тогда все упражнение становится пустой тратой энергии; Я не могу сказать вам, сколько раз я видел это, начиная с 1980-х годов (источник моей предвзятости). Вы можете быть особым случаем. Может быть. Удачи. [PS: мы никогда не обсуждали, что вы собираетесь делать с препроцессором для C; это еще один действительно сложный вопрос].   -  person Ira Baxter    schedule 17.04.2016


Ответы (1)


IIUC, вы можете использовать StringTemplate напрямую.

В качестве фона Antlr сам строит дерево синтаксического анализа в памяти, а затем обходит его, постепенно вызывая StringTemplate для вывода фрагментов кода, квалифицированных соответствующими данными узла дерева синтаксического анализа. То, что Antlr использует внутреннее дерево синтаксического анализа, - это просто удобство для упрощения ходьбы (поскольку Antlr построен с использованием Antlr).

Если у вас есть собственная структура данных, независимо от ее конкретной реализации, процедурно обработайте ее, чтобы постепенно вызывать шаблоны ST для выдачи соответствующего кода. И вы можете напрямую использовать те же шаблоны, что и Antlr (JavaScript.stg), если они соответствуют вашим требованиям.

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

person GRosenberg    schedule 17.04.2016
comment
Это привело меня в веселую погоню, в ходе которой я обнаружил, что для ANTLR4 нет C.stg (есть для ANTLR3; я все еще рассматриваю этот вариант). Написание .stg - это особенно сложная задача, которая не рекомендуется новичкам ни в ANTLR4, ни в целевом языке генерации кода. Так что это ANTLR3 или как-то еще. Спасибо. Кроме того, что вы имели в виду под шаблонами для конкретных узлов? - person Engineer; 17.04.2016
comment
Узел в вашей структуре данных, соответствующий квадрату, коррелирует с шаблоном класса; кружок к шаблону метода. C.stg не является специфическим для Antlr3 или 4. Он специфичен для версии StringTemplate. Не думайте, что синтаксис StringTemplate за какое-то время существенно изменился. - person GRosenberg; 17.04.2016
comment
Эээ, я должен понимать, что ANTLR работает с шаблонами на этих уровнях? Было бы хорошо иметь для этого какой-нибудь дескриптор, если так, чтобы я мог пойти и поискать его. - person Engineer; 17.04.2016
comment
StringTemplate.org - person GRosenberg; 17.04.2016