C ++ не является хорошим языком для сопоставления с шаблонами с такими шаблонами синтаксиса поверхности;в лучшем случае вам придется писать сложных посетителей со всеми видами проверок, которые знают структуру AST.
Вы можете рассмотреть возможность использования инструмента, предназначенного для преобразований AST, например, источник-источник Program Transformation " tool. Большинство из них позволит вам написать какой-нибудь шаблон синтаксиса поверхности, используемый для включения перезаписи, правило вида" если вы видите этот синтаксис , заменитеэто этот синтаксис".
Теперь большинство таких инструментов требуют, чтобы вы каким-то образом определяли язык, которым вы хотите манипулировать для инструмента, поэтому он знает, что это за синтаксис.скажи, каким языком ты хочешь манипулировать, твой SO C ++ тэг, кажется, там, потому что ты хочешь сделать это в C ++. Я не могу помочь тебе с этой частью: - {Меня не удивит, если ты хочешь манипулировать C ++, так какэто то, что вы кодируете, но это только предположение. Но если вы собираетесь использовать инструмент трансформации программы, вам нужно надежное определение языка иЭто трудно получить.Хорошее определение C ++ для этой цели крайне сложно получить, особенно с выходом C ++ 11.
Наш набор инструментов для реинжиниринга программного обеспечения DMS с C ++ Front End сможет сделать это для C ++.DMS обеспечивает синтаксический анализ AST, процедурный доступ к AST (как вы делали в своей программе на C ++, но, что более важно, это понятие шаблонов исходного кода.
Для вашей конкретной задачи вы можете использовать следующий шаблон DMS.
domain Cpp~gcc4;
pattern numeric_literal_index(v: identifier, n: numeric_literal):lhs
" \v[\n] ";
Язык и диалект указываются в объявлении domain . В этом случае язык C ++ (здесь, очевидно, Cpp), а диалект gcc4 (DMS может обрабатыватьРазнообразие диалектов C ++).
Назван шаблон (поскольку у нас часто бывает много шаблонов и правил) * numeric_literal_index *. Шаблон параметризован идентификатором (это токен грамматики C ++)) и numeric_literal (аналогично, но это нетерминал грамматики, который допускает любой из числовых литеральных типов zillion C ++), потому что мы хотим соответствовать 1, 3L и т. д. Шаблон ограничен для соответствия lhs (aC ++ грамматика нетерминальная), хотя на практике это не будет соответствовать чему-либо еще из-за его синтаксиса. Фактический образец заключен в metaquotes "..." , которые изолируют специфический синтаксис C ++ от окружающего моря синтаксиса языка шаблонов.
С этим шаблоном может быть выполнен вызов DMS для соответствияэтот шаблон против узла дерева.Совпадение вернет указатели на узел идентификатора AST и узел дерева numeric_literal.
Конечно, можно написать гораздо более сложные шаблоны и даже переписать правила, используя это.Мораль: используйте правильный инструмент для работы.