regex — удаляет спецификации исключений из кода C ++ с помощью sed

Я хочу автоматически удалить устаревшие спецификации исключений из моего кода C ++ и попытаться использовать sed для этой задачи.

Формат спецификации исключения throw следующий со списком исключений (слов) в скобках, поэтому я написал это sed:

sed -r 's,throw\s*[(].*[)],,g' foo.cpp

Он работает для однострочных спецификаций, но не работает для многострочных.

Кажется, что точка не соответствует символу новой строки, хотя согласно документации она должна: https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html

Я пробовал этот обходной путь, но он также не работает (на самом деле он даже не работает для oneline спецификаций):

sed -r 's,throw\s*[(][\s\S]*[)],,g'

Как заставить это работать должным образом?

РЕДАКТИРОВАНИЕ:

пример спецификации исключения:

void foo() throw (std::runtime_error);  //oneline

void bar() throw (std::runtime_error,
std::logic_error);    //multiline

2

Решение

Многие текстовые редакторы (например, jEdit) поддерживают поиск по регулярным выражениям в нескольких файлах. & заменить.

Однако нет синтаксического различия между спецификацией throw и выражением throw, бросающим переменную в скобках. Два в основном различаются в первую очередь тем, что они не появляются в одном и том же синтаксическом контексте. Вы также можете различить их, решив имя. Но это не сработает, чтобы отличить выражение броска throw(foo()), который выбрасывает созданный по умолчанию объект типа foo, и спецификацию throw throw(foo()), что делает абсурдным, но технически обоснованным утверждение, что аннотированная функция может выдавать исключение типа «функция, которая не принимает аргументов и возвращает foo».

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

3

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector