Я согласен с @Uri, что создание Tree как интерфейса вместо абстрактного класса было бы улучшением.
Если ваш синтаксический анализатор не знает о подклассах Tree, тогда одним из способов является схема на основе отражения, использующаяClass.forName.Другим способом решения этой проблемы было бы использование системы, в которой расширение расширений регистрируется, когда они установлены (пример здесь - реестр плагинов Eclipse, хотя это очень сложный пример этого шаблона).
Ваш более широкий вопросна самом деле о том, как лучше организовать парсеры, написанные на языке ОО.Есть много, много книг на эту тему.Вы можете попробовать взглянуть на эту книгу:
Языковые процессоры программирования на Java: компиляторы и интерпретаторы Дэвид Уотт (автор), Дерик Браун (автор)
Он доступен на Amazon и полезенначинает понимать, как проектировать парсеры языка.Все примеры на Java.
Кроме того, если у вас есть грамматика, вы можете попробовать запустить ее через Antlr и посмотреть на выходные данные, чтобы найти хорошие примеры организации парсера.
http://www.antlr.org/