Прежде всего, обратите внимание, что эта глава не имеет большого отношения к 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.