Size: a a a

Compiler Development

2021 May 26

h

hazer_hazer in Compiler Development
универсального варианта нет. точнее, можно его сделать, но даже парсер-генераторы в итоге дают набор нод, как отдельные типы/классы.
источник

h

hazer_hazer in Compiler Development
Вот я и пишу, что ANTLR вам всё равно выдаст для Identifier ноду с отдельным типов Identifier. Он не будет абсолютно всё делать как Node {NodeList children}
источник

ВМ

Виталий Медоваров... in Compiler Development
Это можно представить на C# в виде
public interface Expr {}
public sealed class Value : Expr { public readonly int x; }
public sealed class PlusOperator : Expr { public readonly Expr lhs; public readonly Expr rhs; }
источник

РС

Роман Соловьев... in Compiler Development
хмм, а почему?

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

h

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

ВМ

Виталий Медоваров... in Compiler Development
При этом можно делать паттерн матчинг с этим в новых версиях шарпов через те же Expression switch выражения
источник

РС

Роман Соловьев... in Compiler Development
а если "арность" выражения будет динамической?:)
источник

ВМ

Виталий Медоваров... in Compiler Development
А, в новых шарпах же ещё data классы появились
источник

h

hazer_hazer in Compiler Development
Потому что вам всё равно в какой-то момент надо будет узнать является ли абстрактный инстанс класса Node Identifier типа. И для этого вам придется записывать тэг вроде NodeKind::Identifier, и потом приводить эту Node к типу Identifier. И если вдруг, там будет не Identifier... 🔥
источник

ВМ

Виталий Медоваров... in Compiler Development
Ну будет список экспров лежать у нужного класса
источник

h

hazer_hazer in Compiler Development
для этого есть vector)
источник

РС

Роман Соловьев... in Compiler Development
вы про записи (record)?
источник

DP

Dmitry Popov in Compiler Development
Там все классы это reference типы, там таких проблем нет
источник

h

hazer_hazer in Compiler Development
а... не знал. И dynamic dispatch будет?
источник

DP

Dmitry Popov in Compiler Development
Ага
источник

ВМ

Виталий Медоваров... in Compiler Development
да
источник

РС

Роман Соловьев... in Compiler Development
так нет, боксинг-анбоксинг  будет, это тоже самое же почти
источник

h

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

РС

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

h

hazer_hazer in Compiler Development
а зачем самому себе создавать проблемы?
вы пишете на ООП языке, и для вас же будет удобнее сделать пару десятков крохатных классов для каждой ноды, чем возиться потом с проверками вроде "Нода идентификатора не может содержать в себе функцию" 😊
источник