Итак, вы хотите обработать код на C++, который использует заголовки MS, и вы хотите получить доступ к AST, чтобы вы могли генерировать код. И Кланг не будет обрабатывать заголовки MS. Так что Clang не может быть ответом, если он не получит радикальное обновление.
Вы попросили «любое решение, которое может сделать эту работу».
Наш DMS Software Reengineering Tookit с его C++14 Front End может это сделать.
DMS обеспечивает общий анализ, построение/проверку/преобразование/генерацию AST и обратный анализ (преобразование АСТ обратно в компилируемый код), параметризованный определениями языка.
Передняя часть C++ предоставляет полный анализатор C++ 14, обработку препроцессора, конструкцию AST и полное разрешение имен и типов. Он был протестирован с файлами заголовков GCC и MS VS 2013; мы сейчас тестируем файлы заголовков 2015. (Он также обрабатывает синтаксис MS VS 2013).
Он полностью обрабатывает жесткие парсинговые футляры, в том числе знаменитый «самый неприятный синтаксис» C++. Вы можете увидеть деревья разбора в get human readable AST from c++ code.
DMS не предоставляет привязки Python, а также прямой интерфейс C++. Скорее, это автономный инструмент, предназначенный для поддержки создания пользовательских инструментов (например, вашего «маленького генератора кода»). У этого есть свой очень обширный набор внутренних API, закодированных в языке метапрограммирования PARLANSE, который похож на LISP. Другие аспекты DMS управляются с помощью DSL для лексеров, грамматик и преобразований. Смотри ниже.
Осторожно: любой инструмент, способный обрабатывать C++, является сложным. DMS соответственно сложна, и требуется некоторое время, чтобы научиться ее использовать, поэтому вы не получите мгновенных ответов. Хорошая новость здесь заключается в том, что некоторые вещи легче сделать. Ваша проблема генерации кода , скорее всего, «прочитает файл скелета, а затем заменит ключевые записи в нем кодом конкретной проблемы».Если это так, то инструмент DMS со следующим кодом (упрощенный для презентации здесь), вероятно, будет делать трюк:
...
(= myAST (Registry:ParseFile (. filename) (. `CppVisualStudio2013') ...)
(Registry:ApplyTransforms myAST (. `MyTransforms.rsl'))
(Registry:PrettyPrint myAST (concat filename `.modified'))
...
с трансформирует файл MyTransforms.rsl, содержащий источник-источник поверхностного синтаксис (например, C++ синтаксис) правила преобразования концептуальной формы
rule rulename if_you_see THIS then replace_by ("-->") THAT
фактическое C++ правило может выглядеть следующим образом (что делает это, потому что я не знаю, ваши фактические цели генерации кода)
rule replace_abstraction(s: STRING_LITERAL):
" abstraction_place_holder(\s) "
-> " my_DSL_library(\s,17); "
Приведенный выше запрос ApplyTransforms будет применять все правила в этом файле до тех пор, пока они не будут применяться дальше.
Преобразования синтаксиса письменной поверхности, где вы можете это сделать, проще, чем делать вызовы в библиотеке процедур (которые, как и Clang, DMS предлагает), которые взломают дерево.
Вы можете написать более сложные метапрограммы с помощью PARLANSE, чтобы применить некоторые правила в одном месте, другие правила где-то еще, и вы можете смешивать преобразования источника с исходным кодом с процедурными преобразованиями, которые взломают непосредственно дерево, если хотите.
Если вы хотите получить более подробную информацию о том, как выглядят трансформации, спросите, и я предоставил ссылку.
вы хотите знать о решениях, которые могут * * разбором заголовки MS ли? –
Любое решение, которое может сделать эту работу, да! – N0vember