Мне интересно узнать синтаксический анализ кода на C++ с помощью regexp. То, что я до сих пор (с помощью рубин) позволяет мне извлечь объявления классов и их родительских классов (если таковые имеются):Ruby Regex: разбор классов C++
/(struct|class)\s+([^{:\s]+)\s*[:]?([^{]+)\s*\{/
Вот в Rubular example. Заметьте, что я могу правильно зафиксировать части «объявления» и «наследование».
Точка в месте, где я застреваю, является захватом класса корпус. Если я использую следующее расширение исходного регулярного выражения:
/(struct|class)\s+([^{:\s]+)\s*[:]?([^{]+)\s*\{[^}]*\};/
Тогда я могу захватить тело класса только если он не содержит никаких фигурных скобок, и, следовательно, любое определение класса или функции. На этом этапе я пробовал много вещей, но ни один из них не сделал это лучше. Например, если я включу в regexp тот факт, что тело может содержать фигурные скобки, оно будет захватывать объявление первого класса, а затем все последующие классы, как если бы они были частью тела первого класса!
Что мне не хватает?
В целом, это правильно. Однако в некоторых случаях регулярное выражение может быть просто «достаточно хорошим». Например. для быстрого эвристического анализа некоторого кода. –
@undur_gongor - указав первое предложение OP - «Мне любопытно разобрать код на C++ с помощью regexp» - это звучит как общее, поскольку они приходят :). Я согласен с тем, что для некоторых задач, читающих HTML или код с использованием regexp, достаточно, если код не является произвольным (вы точно откуда и как он строится) –
Спасибо Uri. Хотя ваш ответ кажется довольно полезным, я только «играл» с возможностями синтаксического анализа кода C++ (например, подсчета количества методов в классе и т. Д.). Я соглашусь с ответом mudasobwa, так как это очень помогло мне, но с учетом вашего ценного совета;) –