Что касается нахождения констант, наш SD Source Code Search Engine (SCSE) может сделать это с полки. SCSE предоставляет интерфейс GUI для поиска по большим наборам файлов смешанного программирования langauge с использованием языка запросов, который точно понимает лексический синтаксис каждого языка.
Типичный запрос:
'for' ... I=index* '=' N<10
найти для ключевых слов вблизи I dentifier, название которого должен начинаться с последовательностью индекса сразу за оператором = с последующим N Умбер, значение которого меньше 10. Поскольку SCSE понимает структуру языка, это не беспокоит пробелы или форматирование ограничений. Он также будет соответствовать шестнадцатеричным значениям для N; он понимает различный формат для литералов и предлагает запросы с точки зрения фактического значения числа, а не как строки.
Учитывая такой запрос, GUI найдет все совпадения во всех ваших файлах и покажет набор обращений; щелчок по удару берет на себя исходный код с выделенной линией попадания.
Чтобы найти все константы, которые не равны нулю, вы пишете следующий очень простой запрос:
N>0
То, что вы действительно хотите, все константы, которые не определены в каком-то постоянном определении. Итак, вы хотите, чтобы удалить любые постоянные-определения из списка совпадений, которые осуществляется с помощью «вычитания запроса» оператор:
N>0 - 'const' 'int' I '=' N
Это находит ненулевые константы, и удаляет любые, которые также соответствуют по константным декларации ,
Ваши другие мечты требуют гораздо более сложного двигателя. По сути, вы хотите проанализировать код на C++ (ваше правило из трех) или расширить язык C++ с помощью некоторых новых функций, а затем реализовать эти функции с использованием стандартных возможностей C++. Вы можете выполнить это, используя program transformation system , который может работать с C++.
Наш DMS Software Reengineering Tookit может это сделать. Он имеет полный C++ front end, который анализирует C++ для внутренних структур данных компилятора и строит полные таблицы символов (и может регенерировать исходный код C++ со всеми деталями из его внутренних структур). Используя этот интерфейс и встроенные возможности DMS для сопоставления шаблонов, вы можете реализовать свою проверку правильности трех.
Для языковых расширений вы можете изменить внешний интерфейс DMS C++, изменив его грамматику, включив дополнительные конструкции, которые считаете идеальными. Затем вы можете записывать преобразования программ, которые ищут такие конструкции, и преобразовывать их в желаемый код. (Эта идея называлась intentional programming Чарльзом Симиони из MS-славы, но это всего лишь частный случай преобразования программы.)
DMS был использован для проведения массивных автоматических преобразований на реальных приложениях на C++. Это может сделать вашу задачу довольно легко с технической точки зрения. Однако понимание определения C++ и того, как все сочетается и как DMS поддерживает преобразования, требует значительной сложности в стиле компилятора. То, что вы предлагаете сделать, - это не работа на день или неделю. Это потребует значительных инвестиций в образование и усилия. Но намного меньше, чем пытаться делать с помощью только YACC.
-WeffC++ сделает 2. для вас. – James
Возможный дубликат [Какие инструменты с открытым исходным кодом C++ для статического анализа доступны?] (Http: // stackoverflow.com/questions/141498/what-open-source-c-static-analysis-tools-are-available) –