извлечь аргументы из функции с помощью сценариев - PullRequest
0 голосов
/ 27 июля 2010

У меня есть файл с такими прототипами функций:

int func1(type1 arg, int x);

type2 funct2(int z, char* buffer);

Я хочу создать скрипт (bash, sed, awk, что угодно), который будет печатать

function = func1 // first argument type = type1// second argument type = int
function = func1 // first argument type = int// second argument type = char*

другими словами, токенизируйте каждую строку и напечатайте имена функций и аргументы.Кроме того, я хотел бы сохранить эти токены в качестве переменных, чтобы напечатать их позже, например, echo $4.

Ответы [ 2 ]

1 голос
/ 07 января 2012

Альтернативный подход заключается в компиляции с "-g" и чтении отладочной информации.
Этот ответ может помочь вам прочитать отладочную информацию и выяснить параметры функции (это Python, а не bash, но я бы все равно рекомендовал использовать Python или Perl вместо bash).

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

Чтобы убедить вас лучше (или помочь вам сделать это правильно, если вы не уверены), вот список тестовых случаев, которые могут нарушить ваш анализ:

// Many lines
const
char
*

f
(
int
x
)
{
}

// Count parenthesis!
void f(void (*f)(void *f)) {}

// Old style
void f(a, b)
int a;
char *b
{
}

// Not a function
int f=sizeof(int);

// Nesting
int f() {
    int g() { return 1; }
    return g();
}

// Just one
void f(int x /*, int y */) { }

// what if?
void (int x
#ifdef ALSO_Y
     , int y
#endif
) { }

// A function called __attribute__?
static int __attribute__((always_inline)) f(int x) {}
0 голосов
/ 27 июля 2010

вот начало.

#!/bin/bash
#bash 3.2+
while read -r line
do
  line="${line#* }"
  [[ $line =~ "^(.*)\((.*)\)" ]]
  echo  "function: ${BASH_REMATCH[1]}"
  echo  "args: ${BASH_REMATCH[2]}"
  ARGS=${BASH_REMATCH[2]}
  FUNCTION=${BASH_REMATCH[1]}
  # break down the arguments further.
  set -- $ARGS
  echo "first arg type:$1 , second arg type: $2"
done <"file"

выход

$ ./shell.sh
function: func1
args: type1 arg, int x
first arg type:type1 , second arg type: arg,
function: funct2
args: int z, char* buffer
first arg type:int , second arg type: z,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...