Size: a a a

Compiler Development

2021 May 26

DP

Dmitry Popov in Compiler Development
Зочем избегать свича по kind? В ФП у нас там паттерн-матчинг по сути тот же свич делает.
источник

DP

Dmitry Popov in Compiler Development
Есть конечно правослано ООПшный подход в визиторами, но нафиг-нафиг.
источник

h

hazer_hazer in Compiler Development
дааа... это всё конечно удобно. Я говорю о том, чтобы не делать общий абстрактный Node тип, и потом делать тысячу проверок для каждой из них, исходя из её kind, так как, как я выше привел пример — некоторые ноды содержат какие-то значения, некоторые список других нод, некоторые вообще пустые.
источник

DP

Dmitry Popov in Compiler Development
А как делать?
источник

РС

Роман Соловьев... in Compiler Development
я просто усложнил себе задачу тем, что все этапы после лексического анализа делаю динамическими исходя из грамматики. т.е. парсится грамматика и погнали.

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

h

hazer_hazer in Compiler Development
парсить Identifier в Identifier, а не в Node
Потому что в Node тогда надо ещё и придумать как значение для Identifier хранить ещё...
источник

DP

Dmitry Popov in Compiler Development
А, разные типы. да
источник

РС

Роман Соловьев... in Compiler Development
ну я вот предлагаю визитор на этапе семантического анализа делать. так же работает ANTLR. он генерит классы, а ты потом их визитором обходишь
источник

h

hazer_hazer in Compiler Development
ну вот, я плохо мысль доносил. Очевидно, что Identifier это субтип Node
источник

РС

Роман Соловьев... in Compiler Development
разница лишь в объем преобразований и проверок в визиторе (да, их будет в разы больше)
источник

h

hazer_hazer in Compiler Development
а их можно и не делать, если каждая нода будет со своим типов. и всё что вам придется сделать в визиторе это реализовать visit(Node) для каждого типа Node
источник

РС

Роман Соловьев... in Compiler Development
да, так и есть)

а в моем случае мне придется делать это исходя из типа описанного строкой в поле "Type"
источник

h

hazer_hazer in Compiler Development
а почему? то, что вы описали звучит логично. Но зачем строка как тип?!?!
источник

РС

Роман Соловьев... in Compiler Development
Но, возвращаемся к построению AST)

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

РС

Роман Соловьев... in Compiler Development
чтобы не заниматься генерацией кода😬
источник

h

hazer_hazer in Compiler Development
не понимаю вашей логики
источник

h

hazer_hazer in Compiler Development
это абстрактное описание. мы же с вами говорим уже о практике
источник

KR

K R in Compiler Development
Комментарии.
источник

РС

Роман Соловьев... in Compiler Development
да, т.е. CST, мне надо его построить. Но если я правильно понимаю я могу его построить без заранее описанного AST, разве нет?
источник

h

hazer_hazer in Compiler Development
То есть. Неважно ФП это или ООП.
У нас на руках AST (обычно) это набор Node разных типов, некоторые из которых могут содержать другие ноды. И если вы хотите сделать более абстрактный парсинг, чтобы не делать множество проверок на уровне парсинга. То... я также делаю, но потом линтером прохожусь по AST (линтер — визитор) и чекаю, чтобы не было семантических ошибок вроде, ну к примеру "нельзя делать chained assignment".
источник