Подсобите с регулярным выражением?
Очевидно, нужны рекурсивные регулярки.
https://regex101.com/r/SBqnii/7
С группами можно поиграться. Наверн, придётся пропускать регулярку по результату ещё раз, но думаю это проще и возможно даже быстрее использования конечного автомата. А на пример подобного автомата я бы посмотрел :)
Сравнение производительности с конечным автоматом:
https://jsperf.com/regex-vs-fsa/1
Ответ не верен, но я слишком долго его писал, так что мне жалко его удалять :DВот так можно получить
1) AAA(CCC(C1_1);A1_1);
2) BBB(B1_1; B1_2);
3) DDD(D1_1).
Я не уверен, но, насколько мне известно, так как CCC(C1_1) уже находится в найденном (внутри AAA(CCC(C1_1);A1_1)), второй раз его вы не найдёте, для этого придётся повторять парсинг для группы 2 каждого включения.
Также в примере вы можете увидеть, что тройное вложение под это правило уже не подойдёт. Вы можете расширить регулярку для отлавливания любого конечного количества вложений, но лично я бы не советовал их использовать для подобных задач. Отмечу, что в регулярках я шарю не очень, так что возможно мой совет некорректен, в таком случае прошу прощения.
UPD: Изменил пример. Предыдущая регулярка искала AAA(bar; BBB(); foo) но путалась с AAA(BBB(); foo; DDD(); bar).