Извлечение только имен функций и их комментариев из кода C - PullRequest
2 голосов
/ 08 ноября 2011

Я хочу извлечь комментарии и узнать, из каких функций они работают.У меня есть много таких файлов C, как показано ниже:

С вводом:

void main()
{
    //sdgs
    call A;
    /*
    sdfgs
    dfhdfh
    */
    call b;
    some code;
}

/* this function adds
 something */
int add()
{
    //sgsd
    some code;
    //more comments
    some code;
}

Вывод должен быть:

void main()
{
    //sdgs

    /*
    sdfgs
    dfhdfh
    */

}

/* this function adds
 something */
int add()
{
    //sgsd

    //more comments

}

Входной код аккуратно отформатирован, и «код функции» начинается после { на следующей строке.По сути, мне просто нужно знать, какой «комментарий» от какой функции.Также он должен включать любые другие комментарии над именем функции или где-либо еще. Примечание: это отличается тем, что там должны быть имена функций на верхнем уровне.

Чтобы упростить мои требования:

  1. Распечатать все комментарии
  2. Определите блок, содержащий ( в первой строке, с одной строкой, содержащей только { в первом столбце после одной-трех строк, и напечатайте строки непосредственно выше.

Ответы [ 3 ]

6 голосов
/ 08 ноября 2011

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

Почему?

Сначала есть макросы, которые нужно заменить в первую очередь.Второе, потому что определения функций вроде «трудно» вставить в регулярное выражение.Некоторые юридические определения функций:

int f() {}
const int f() {}
const char* f(int);
void f(double t);
void f(t,a) int t; int (*a)(float, char, char) {}
2 голосов
/ 08 ноября 2011

Возможно, это не выполнимо в очень общем смысле (например, потому что функции могут быть определены тем, что, по-видимому, является вызовом макроса).

Но если вы не заботитесь о совершенстве, вы можете создать простой лексер и парсер, который почти справится с этой задачей (для входного кода, который не слишком надуман).

Я не уверен, что это полезно. Вы должны объяснить, чего вы действительно хотите достичь.

0 голосов
/ 08 ноября 2011

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

Попытка:

comments.awk:

/^(int|void|{|}|etc.)/{print $0;next}
/\/\*/,/\*\//{print $0;next}
/\s*\/\//{print $0;next}

позвонить по номеру:

awk -f comments.awk file1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...