2012-03-15 3 views
2

Я пытаюсь повторно использовать совпадение с функцией C, например.emacs regexp заменить вызов функции C

func(blah blah); 

В матче могут быть символы перевода.

Я пробовал:

func([.+]); 

, который не делал перевода строки, а:

func([...]); 
func([^...]); 

ни один из которых, казалось, сделать что-нибудь. Я предполагаю, что я ищу часть регулярного выражения, которая будет соответствовать любому номеру/типу символов между моим открытием func( и );.

+1

Что делать, если аргументы также включают круглые скобки? например 'FUNC (х * (у + г))'. –

+0

они не так уж и не проблема в этом случае – bph

+0

Возможно, emacs имеет что-то «встроенное» для комментирования/раскодирования вызовов функций C в обход необходимости явного регулярного выражения? – bph

ответ

4

Вы можете попробовать func[[:space:]]*([^)]*). Вложенные парнеры в звонках будут путать его, хотя.

3

Я думаю, что общий случай невозможен с регулярными выражениями, потому что вложенные вызовы функций не являются regular language.

+0

к счастью, это не общий случай - достаточно хорошо, чтобы работать через мои собственные файлы (где я знаю, что я не вложил никаких круглых скобок) – bph

1

Хотя ответ Максима специфичен, я собираюсь угадать, что вы хотите что-то сделать с помощью соответствующей функции, которую вы нашли. Чтобы выполнить серьезную обработку кода, вы не можете победить семантический парсер, который является частью набора инструментов CEDET. http://cedet.sf.net также является частью Emacs.

Если используется семантический анализатор в Emacs, вы можете:

M-x semantic-mode RET 

, а затем в коде:

(semantic-fetch-tags) 

или

(semantic-current-tag) 

, чтобы получить текущий тег. После того, как у вас есть тег, вы можете позвонить:

(semantic-tag-function-arguments mytag) 

, чтобы получить аргументы, которые являются тегами. Для одного из них используйте semantic-tag-name, чтобы получить имя, или semantic-tag-type, чтобы получить тип данных.

Как только вы получили данные своего тега, вы всегда можете выписать новый код с помощью SRecode, который является генератором кода, который будет принимать теги и выплевывать код, например объявления функций.

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