Size: a a a

Compiler Development

2021 May 26

РС

Роман Соловьев... in Compiler Development
хотя я пока что не понимаю как)
источник

h

hazer_hazer in Compiler Development
Ну. В случае с CST многого сказать не могу — не приходилось делать полноценное CST.
Но проще разделять набор CST нод и набор AST нод. При этом CST и AST будут корректными, только если парсер не сгенерировал ни одной ошибки
А если у вас есть CST, то вы очень легко из него сделаете AST, так как AST отличается от него лишь отсутствием токенов содержащих лишь синтаксический смысл ({, например)
источник

h

hazer_hazer in Compiler Development
Про ошибки в парсинге это я к тому, что вы не должны получить CST из программы с неправильными конструкциями.
То есть, если пользователь написал func ; foo() {}, то CST:
- Либо не должно в принципе собраться
- Либо вы слегка заморочитесь и сделаете специальный ErrorNode, который в данном примере будет стоять вместо ; после func
источник

K

Kir in Compiler Development
Э!
источник

K

Kir in Compiler Development
Вот щас обидно было
источник

K

Kir in Compiler Development
Да и котёл - такое себе, у него паттерн-матчинг почти не развит
источник

h

hazer_hazer in Compiler Development
я возможно отдалился слишком сильно. Но это всё я говорю для того, чтобы вы поняли, что "Абстрактные решения" не настолько абстрактные как вы думаете
источник

K

Kir in Compiler Development
Если меняется суть языка - добавляются фичи, например - то добавлять в/менять само AST и парсер
источник

h

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

(если конечно из-за этого синтаксиса ваш парсер не превратится из LL в LR 😁)
источник

K

Kir in Compiler Development
Правда? Блин, надо было мне новости-то читать

Убежал читать
источник

K

Kir in Compiler Development
Во. Это будет абсолютный ад.
источник

РС

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

но все же, из примеров @slowpnir AST - это набор структур для удобного хранения.

но ведь CST заполняется не исходя из описанных в AST структур.
источник

РС

Роман Соловьев... in Compiler Development
где подписать?😂
источник

K

Kir in Compiler Development
У тебя есть - в голове - описание того, какие конструкции будут в языке и как они будут вложены. Вот AST и есть тип-описание этой структуры. А парсер будет строить объект этого типа.
источник

K

Kir in Compiler Development
Не, у меня парсер возвращает объект типа program как раз
источник

h

hazer_hazer in Compiler Development
я бы сделал на основе AST 100%.

Так как CST это дерево всё для того же самого языка.

Приведу пример:
func foo

func
foo()


Предположим яп разрешает делать здесь перенос строк. И единственное чем нода FunctionDeclaration в CST будет отличаться от AST аналога это значением, хранящим условный перенос строки.
Вот и всё (на самом деле много где ещё можно такое сделать, но самое главное, что CST не дает вам возможности собрать его из вообще чего угодно — это всё ещё дерево синтаксиса вашей грамматики)
источник

K

Kir in Compiler Development
У меня бы оба текста отображались бы в одно и то же AST, c разными location в полях Info у узлов
источник

h

hazer_hazer in Compiler Development
да. AST будет одно. а вот CST разные
источник

K

Kir in Compiler Development
Пора в чате вводить разные синтаксис для типов и значений в сообщениях
источник

K

Kir in Compiler Development
И никто не хранит переводы строк в дереве. Я надеюсь, ты имел ввиду, что у имени foo будут другие значения полей line/column
источник