сколько ast генерирует программа llvm? - PullRequest
0 голосов
/ 26 сентября 2018

Я читаю руководство по написанию компилятора llvm: https://llvm.org/docs/tutorial/LangImpl02.html

В этом руководстве в качестве примера они используют простой язык под названием «калейдоскоп».Перед прочтением этого руководства у меня сложилось впечатление, что для каждой программы создается один AST (я предполагаю, что программа написана в одном файле и, следовательно, ссылки не требуются).Но похоже, что llvm создает отдельный AST для каждой строки (или, если быть более точным, для каждой конструкции).Следовательно, для одной программы llvm может создать сотни отдельных аст.Правильно ли это толкование?

1 Ответ

0 голосов
/ 26 сентября 2018

Прежде всего, обратите внимание, что эта глава не имеет большого отношения к LLVM.Это просто объясняет, как написать парсер и AST для языка.Он не использует никакого кода из библиотеки LLVM¹ и не будет выглядеть иначе в проекте, который вообще не использует LLVM².Специфичная для LLVM часть появляется позже, когда вы переводите AST в LLVM IR.Так что, во всяком случае, дело не в том, что LLVM генерирует «множественные AST», а в том, что код из учебника генерирует «множественные AST».

Так правильно ли говорить, что код генерирует несколько AST?Вид - все зависит от того, что именно вы подразумеваете под этим.

Как и любое дерево, AST состоит из нескольких поддеревьев.Каждое поддерево само по себе является допустимым деревом.Таким образом, вы можете сказать, что каждое нетривальное дерево на самом деле является коллекцией нескольких деревьев, и это также применимо к AST в учебнике.

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


¹ Кроме llvm::make_unique, но это также можно заменить наstd::make_unique если ваш компилятор поддерживает C ++ 14 или вашу собственную реализацию, если это не так.

² На аналогичном замечании также вполне возможно написать компилятор на основе LLVM путем генерации IR LLVMнепосредственно в парсере и вообще не создавать никаких AST.Будь и как генерировать свои AST, полностью не зависит от LLVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...