Хорошие инструменты для создания [закрытого] синтаксического анализатора/анализатора C/C++

Вы можете посмотреть Seam (см. в этой статье для обсуждения использования Seam с JSF и AJAX).

Когда я использовал Судя по всему, в последний раз это было довольно медленно. Возможно, вы захотите создать свой собственный компонент JSF, который генерирует JavaScript (например, используя jQuery, как описано в в этой статье ).

49
задан leppie 24 June 2009 в 18:32
поделиться

14 ответов

Парсинг C++ чрезвычайно труден, потому что грамматика неразрешима. К кавычке Yossi Kreinin :

Исключительно сложная грамматика

"Исключительно" должна быть интерпретирована буквально, потому что все популярные языки имеют контекстно-свободный (или "почти" контекстно-свободный) грамматики, в то время как C++ имеет неразрешимый грамматика. Если Вам нравятся компиляторы и синтаксические анализаторы, Вы, вероятно, знаете то, что это означает. Если Вы не в такого рода вещь, существует простой пример показ проблемы с парсингом C++: [действительно ли 110] определение объекта или объявление функции? Оказывается, что ответ зависит в большой степени от кода прежде оператор - "контекст". Это показывает (на интуитивном уровне), что грамматика C++ довольно контекстно-зависима.

35
ответ дан Adam Rosenfield 7 November 2019 в 11:24
поделиться

Некоторое время назад я попытался записать инструмент, который автоматически генерирует модульные тесты на c файлы.

Для предварительной обработки я провел файлы через GCC. Вывод ужасен, но можно легко проследить где в исходном коде из предварительно обработанного файла. Но для Ваших потребностей Вам еще, возможно, понадобилось бы что-то.

я использовал Метр как основа для синтаксического анализатора C. Это - открытый исходный код и использует закон и yacc. Это помогло встать и работающий в скором времени, полностью не понимая закон & yacc.

я также записал приложение C начиная с закона & решение для yacc не могло помочь мне проследить функциональность через функции и проанализировать структуру целой функции в одной передаче. Это стало неудобным в сопровождении в скором времени и отказалось.

1
ответ дан Gerhard 7 November 2019 в 11:24
поделиться

как насчет чего-то более легкого для понимания как крошечный-C или Маленький C

2
ответ дан Scott Evernden 7 November 2019 в 11:24
поделиться

Грамматика для C++ является видом известно волосатых. Существует хороший поток в Lambda об этом, , но суть - то, что грамматика C++ может потребовать произвольно большого предвидения.

Для вида вещи я предполагаю, что Вы могли бы делать, я буду думать о взламывании или Гну CC, или Шплинт . CC гну в особенности выделяет часть поколения языка довольно полностью, таким образом, Вы могли бы быть лучшими от создания нового g ++ бэкенд.

6
ответ дан Charlie Martin 7 November 2019 в 11:24
поделиться

Взгляните на то, как работы doxygen, полный исходный код доступен, и это основано на гибком проводе.

кандидат введения в заблуждение А ЗОЛОТО , который является свободным инструментарием синтаксического анализатора на базе Windows явно для создания переводчиков. Их список поддерживаемые языки относятся к языкам, на которых может реализовать синтаксические анализаторы, не список поддерживаемых грамматик синтаксического анализа.

у Них только есть грамматики для C и C#, никакого C++.

8
ответ дан albert 7 November 2019 в 11:24
поделиться

Elsa бьет все остальное, что я знаю, передает для парсинга C++, даже при том, что это не на 100% совместимо. Я - поклонник. Существует модуль, который распечатывает C++, так, чтобы могла быть хорошая начальная точка для Вашего игрушечного проекта.

3
ответ дан user52875 7 November 2019 в 11:24
поделиться

В зависимости от Вашей проблемы GCCXML мог бы быть Вашим ответом. В основном это анализирует источник с помощью GCC и затем дает Вам легко удобоваримый XML дерева синтаксического анализа. С GCCXML Вы сделаны раз и навсегда.

16
ответ дан Łukasz Lew 7 November 2019 в 11:24
поделиться

парсер-генератор ANTLR имеет грамматика для C/C++, а также препроцессора. Я никогда не использовал его так, я не могу сказать, как завершенный его парсинг C++ будет. Сам ANTLR был полезным инструментом для меня в нескольких случаях для парсинга намного более простых языков.

17
ответ дан Sean McCauliff 7 November 2019 в 11:24
поделиться

Можно посмотреть лязг , который использует llvm для парсинга.

Поддержка C++ полностью теперь ссылка

21
ответ дан epatel 7 November 2019 в 11:24
поделиться

C++ Парсинга является очень сложной проблемой .

существует платформа Повышения/Духа, и несколько лет назад они сделали игра с идеей реализовать синтаксический анализатор C++ , но это совсем не завершено .

Полностью и правильно парсинг C++ ISO совсем не тривиально, и было на самом деле много связанных усилий. Но это - по сути сложное задание, которое легко не выполняется, не переписывая полный компилятор frontend понимающий весь C++ и препроцессор. Реализация препроцессора, названная "волной", доступна от людей Духа.

Тем не менее Вы могли бы хотеть взглянуть на свинина/хрюканье (находящийся в elsa), который является инструментарием синтаксического анализатора C++, конкретно означал использоваться в целях преобразования исходного кода, она используется проектом Mozilla сделать крупномасштабный статический анализ исходного кода и автоматизированную перезапись кода, самая интересная часть - то, что она не только поддерживает большую часть C++, но также и сам препроцессор!

, С другой стороны, существует действительно одно единственное доступное собственное решение: EDG frontend, который может использоваться для в значительной степени всех связанных с C++ усилий.

Лично, я проверил бы находящийся в elsa комплект свинины/хрюканья, который используется в Mozilla кроме этого, FSF теперь утвердил работу над gcc плагины использование лицензии библиотеки времени выполнения, таким образом я предположил бы, что дела идут измениться быстро, как только люди могут легко усилить находящийся в gcc синтаксический анализатор C++ в таких целях с помощью двоичных плагинов.

Так, вкратце: если Вы маркеры: EDG, если Вам нужно что-то свободное/с открытым исходным кодом теперь : еще/хрюканье являются довольно многообещающими, если у Вас есть некоторое время, Вы могли бы хотеть использовать gcc для своего проекта.

Другая опция только для кода C cscout.

7
ответ дан none 7 November 2019 в 11:24
поделиться

pycparser является полным синтаксическим анализатором для C (C99) записанный в Python. Это имеет полностью настраиваемый бэкенд AST, таким образом, это используется в качестве основания для любого вида обработки языка, Вам, возможно, понадобилось бы.

Не поддерживает C++, все же. Предоставленный, это намного более твердо, чем C.


Обновление (2012): в это время ответ, без любого сомнения, был бы Лязгом - это является модульным, поддерживает полный C++ (со многими C ++-11 функций) и имеет относительно дружественную кодовую базу. Это также имеет API C для привязки к высокоуровневым языкам (т.е. для Python).

13
ответ дан Eli Bendersky 7 November 2019 в 11:24
поделиться

См. Наш Интерфейс C ++ для полнофункционального парсера C ++: строит AST, таблицы символов, называет и разрешение типа. Вы даже можете проанализировать и сохранить препроцессор директивы. Интерфейс C ++ построен на основе нашей DMS Software Reengineering. Инструментарий , который позволяет использовать эту информацию для выполнения произвольных исходный код изменяется с использованием преобразований из исходного в исходный.

DMS - идеальный механизм для реализации такого преобразователя.

Сказав это, я не вижу особого смысла в вашей воображаемой задаче; Я не видите большую ценность в попытках заменить C ++, и вы обнаружите, что полный переводчик - это огромный объем работы, особенно если ваш target - это «игрушечный» язык. И вряд ли в этом есть смысл синтаксический анализ C ++ с использованием надежного синтаксического анализатора, если его единственной целью является создание изоморфная версия C ++, которую легче анализировать (подождите, мы постулировали уже надежный C ++!)

РЕДАКТИРОВАТЬ Май 2012 г .: интерфейс C ++ DMS теперь обрабатывает GCC3 / GCC4 / C ++ 11, Microsoft VisualC 2005/2010. Надежно.

РЕДАКТИРОВАТЬ февраль 2015 г .: Теперь обрабатывает C ++ 14 на диалектах GCC и MS.

РЕДАКТИРОВАТЬ август 2015 г .: Теперь анализирует и фиксирует как код, так и директивы препроцессора в едином дереве.

2
ответ дан 7 November 2019 в 11:24
поделиться

Что касается использования такого инструмента, как GNU CFlow, который может анализировать код и создавать графики вызовов, вот что говорит о потоке opengroup(man page). Версия cflow в GNU поставляется с исходными текстами, а также с открытым исходным текстом ...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1
ответ дан 7 November 2019 в 11:24
поделиться

На самом деле, PUMA и AspectC++ по-прежнему активно поддерживаются и обновляются. Я изучал использование AspectC++ и сам задавался вопросом об отсутствии обновлений. Я отправил электронное письмо автору, который сказал, что и AspectC++, и PUMA все еще находятся в разработке. Вы можете получить исходный код через SVN https://svn.aspectc.org/repos/ или получить обычные бинарные сборки на http://akut.aspectc.org. Как и во многих отличных проектах на C++ в наши дни, у автора нет времени следить за обслуживанием веб-страницы. Имеет смысл, если у вас есть работа на полный рабочий день и жизнь.

4
ответ дан 7 November 2019 в 11:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: