Чтобы определить, какие операции являются «встроенными», вы должны быть в состоянии проанализировать C ++ и определить для каждого подвыражения, какие типы операндов есть. Тогда выбираются встроенные операции, когда операнды являются скалярами типа char, int, long, float, double, pointer и т. Д.
(Не встроенными являются имена функций и знаки препинания операторов, которые использовались для переопределения таких операторов в различных определениях классов).
Синтаксический анализ C ++ довольно сложен для большинства людей. «Просто» парсер / лексер не доставит вас туда скоро или легко. Что действительно сложно, так это определить значение имен, определить типы имен, а затем определить, что означают различные подвыражения, потому что вы должны кодировать несколько сотен страниц стандарта C ++, который описывает, как все это работает. Что вам действительно нужно, так это готовый интерфейс C ++, который будет соответствовать вашей воле.
Хотя GNU и MSVC имеют полноценные интерфейсы C ++, они на самом деле хотят быть компилятором, и в значительной степени не могут помочь вам легко.
Набор реинжиниринга программного обеспечения DMS идеально подходит для этой задачи. Он разработан для поддержки создания пользовательских инструментов анализа и имеет полные языковые интерфейсы для многих стандартных языков, включая C, Java, C #, COBOL ... и, наконец, C ++.
DMS анализирует исходный текст так же, как и компилятор, создает структуры данных компилятора (деревья, таблицы символов и т. Д.) И делает их доступными главным образом с помощью процедурного API, чтобы вы могли писать запросы к этим структурам данных.
Один из этих запросов: «для этого дерева, какой тип?». Используя это, довольно просто определить, есть ли у вас «стандартный» оператор, такой как integer-add.
РЕДАКТИРОВАТЬ: (Как ни странно, через несколько дней после написания этого ответа, я только что получил небольшой контракт, чтобы идентифицировать все не встроенные операторы в программе C ++!).