Используйте ANTLR для разбора C ++ с C #

Я пытаюсь использовать ANTLR для получения C ++ AST, если это возможно, из моей базы кода C #.

Теперь основной рабочий процесс кажется мне понятным: сгенерируйте лексер и анализатор .cs, используя ANTLRWorks, добавьте их и ссылки ANTLR на проект C #, предоставьте ему источник C ++, работайте с результирующими структурами данных.

Однако я уже проваливаюсь на втором этапе. Я загрузил грамматику C ++ из http://www.antlr.org/grammar/list (Я попробовал «грамматику C ++» Аврелиана Мелинта и «грамматику C ++ и трассировщик кода для ANTLR 3.2» Рамина Заги) и сгенерировал лексер и анализатор для C #, установив «language = CSharp3;» в вариантах грамматики. Однако я не могу скомпилировать проект C #, содержащий файлы парсера и лексера.

Проблема в том, что я понятия не имею, является ли это проблемой используемой мной грамматики или доступных версий … Существует так много разных версий ANTLR, сред выполнения C # и целей C #, которые пытаются пробовать каждую комбинацию кажется довольно безнадежной задачей.

Тем не менее, текущая комбинация, кажется, работает нормально, небольшой пример грамматики выходит с одной ошибкой («HIDDEN» в лексере c # нужно изменить на «Hidden» и все), но синтаксический анализатор / лексер C ++ по-прежнему дает мне множество ошибок компилятора, в основном связанных с директивами препроцессора и объявлениями массивов.

Кому-нибудь удалось проанализировать C ++ с помощью файлов C #, созданных ANTLR? У кого-нибудь есть идеи, как это должно работать?

2

Решение

Проблема в том, что в обеих грамматиках есть встроенный код, и этот код написан на C ++. Встроенный код очень распространен в сложных грамматиках, поэтому вам нужно найти грамматику для разбора C ++ в C #, а не просто разбирать C ++. В качестве примечания, если вы можете найти тот, который анализирует C ++ в Java, вы можете использовать IKVM использовать его из C #.

3

Другие решения

Единственная грамматика ANTLR, которую я когда-либо видел для C ++, была оставлена ​​его автором как неполная, и он пытался использовать только C ++ 98 (YMMV). C ++ 11 (и, да, воистину, C ++ 14) здесь и намного сложнее. Сборка C ++ для производства действительно сложно, и если вы не можете получить тот, который был проверен на огне, он, вероятно, не работает на реальном коде.

Я предлагаю вам использовать Clang, интерфейс EDG C ++ или наш DMS Software Reengineering Toolkit, каждый из которых имеет надежный синтаксический анализатор C ++. Если вы хотите манипулировать разобранным C ++ для каких-то целей, вам понадобится больше машин, чем «простого» парсера.

0