В настоящее время я пишу программу, которая находится поверх интерпретатора С++. Пользователь вводит команды С++ во время выполнения, которые затем передаются в интерпретатор. Для некоторых шаблонов я хочу заменить команду, заданную модифицированной формой, чтобы я мог предоставить дополнительную функциональность.
Я хочу заменить что-нибудь из формы
A->Draw(B1, B2)
с
MyFunc(A, B1, B2).
Моя первая мысль была регулярными выражениями, но это было бы скорее подвержено ошибкам, так как любой из A
, B1
или B2
мог быть произвольным выражением С++. Поскольку эти выражения сами могли содержать цитированные строки или круглые скобки, было бы довольно сложно сопоставить все случаи с регулярным выражением. Кроме того, могут быть несколько вложенных форм этого выражения
Моя следующая мысль заключалась в том, чтобы вызвать clang как подпроцесс, использовать "-dump-ast", чтобы получить абстрактное синтаксическое дерево, изменить его, а затем перестроить в команду, которая будет передана интерпретатору С++. Однако это потребует отслеживания любых изменений среды, таких как включение файлов и форвардных объявлений, чтобы дать достаточно информации для анализа выражения. Поскольку интерпретатор не раскрывает эту информацию, это также представляется неосуществимым.
Третья мысль заключалась в том, чтобы использовать собственный синтаксический анализ интерпретатора С++ для преобразования в абстрактное синтаксическое дерево, а затем строить оттуда. Тем не менее, этот интерпретатор не раскрывает аш каким-либо образом, который я смог найти.
Есть ли какие-либо предложения относительно того, как действовать, как по одному из указанных маршрутов, так и по другому маршруту?