2015-10-07 2 views
4

Я нахожусь в Windows, используя MSVC для компиляции моего проекта, но мне нужен clang для его аккуратного анализатора АСТ, который позволяет мне написать небольшой генератор кода.
Проблема заключается в том, что clang не может анализировать заголовки MSVC (очень хорошо известная и понятная проблема).Игнорировать недостающие заголовки с clang Анализатор АСТ

Я попробовал два варианта:

  1. включаю папку заголовка MSVC, анализ встроенных заголовков, включенных в мой код закончится вверх приводит к фатальной ошибке в какой-то момент, не давая мне разбора частей Я хочу правильно.
  2. То, что я делал раньше, просто не предоставляет встроенных заголовков и пересылает объявления типов, которые мне нужны. Он отлично работал, и как-то он больше не с последним Clang. Я действительно не знаю, изменилась ли политика парсера на отсутствующий заголовок, но он вызывает полный сбой каждый раз, когда включается что-то вроде <string> и не сильно разбирается.

Я использую привязки python (libclang), но я бы подумал о переходе на C/C++ API, если там будет решение.

В любом случае я могу изменить это поведение и заставить clang продолжать разбор, даже если некоторые заголовки не найдены?

+0

вы хотите знать о решениях, которые могут * * разбором заголовки MS ли? –

+0

Любое решение, которое может сделать эту работу, да! – N0vember

ответ

0

Итак, вы хотите обработать код на 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, чтобы применить некоторые правила в одном месте, другие правила где-то еще, и вы можете смешивать преобразования источника с исходным кодом с процедурными преобразованиями, которые взломают непосредственно дерево, если хотите.

Если вы хотите получить более подробную информацию о том, как выглядят трансформации, спросите, и я предоставил ссылку.

1

Использование SetSuppressIncludeNotFoundError. Принял мне час, чтобы найти! Вы можете себе представить, как я был рад найти его!

https://clang.llvm.org/doxygen/classclang_1_1Preprocessor.html#ac7bafe67fc32e41460855b39d20ff6af

+0

Это было бы здорово, теперь я должен проверить, открыт ли этот параметр в привязках python – N0vember

Смежные вопросы