Regex для вытаскивания объявлений прототипа функции C?

В дополнение к ответам и публикации того, что сработало для меня:

1 следовали этому руководству, чтобы установить лампу https://www.digitalocean.com/community/tutorials/how-to-install -inux-apache-mysql-php-lamp-stack-on-ubuntu-16-04 (Третий шаг необходим только для установки клиента mongo)

2 $ sudo apt-get install php7.0-dev

3 $ sudo pecl install mongodb

4 $ sudo nano /etc/php/7.0/apache2/php.ini

Добавить в файл следующую строку:

extension = mongo.so ;

(Возможно, вам нужно указать точное местоположение файла. В моем случае файл находился в /usr/lib/php/20151012/mongodb.so.)

blockquote>

И все это для установки только клиента mongo для php 7.0

Я дополняю ответ Pransh Tiwari

24
задан Chad Birch 3 April 2009 в 22:10
поделиться

4 ответа

Можно реализовать синтаксический анализатор с помощью ANSI C yacc/lex грамматика .

17
ответ дан Quassnoi 28 November 2019 в 23:34
поделиться

Для одноразового осуществления Вы, вероятно, приложили бы все усилия путем запуска простой и рассмотрения кода, который необходимо просканировать. Выберите три худших заголовка, генерируйте regex или серию regexes, которые делают задание. Необходимо решить, ли и как Вы идете соглашение с комментариями, которые содержат объявления функции (и, действительно, с объявлениями функции, которые содержат комментарии). Контакт с:

extern void (*function(int, void (*)(int)))(int);

(который мог быть Стандартом C функция signal()) жестко в regex из-за вложенных круглых скобок. Если Вы не имеете никаких подобных прототипов функции, приводите к таймауту потраченной работы, как иметь дело с ними, потраченное впустую время. Подобные комментарии относятся к указателям на многомерные массивы. Возможности состоят в том, что у Вас есть стилистические соглашения упростить Вашу жизнь. Вы не можете использовать C99 (C++) комментарии; Вы не должны кодировать вокруг них. Вы, вероятно, не помещаете многократные объявления в одну строку, или с или без общего типа - таким образом, Вы не должны иметь дело с этим.

extern int func1(int), func2(double); double func3(int);  // Nasty!
7
ответ дан Jonathan Leffler 28 November 2019 в 23:34
поделиться

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

^
\s*
(unsigned|signed)?
\s+
(void|int|char|short|long|float|double)  # return type
\s+
(\w+)                                    # function name
\s*
\(
[^)]*                                    # args - total cop out
\)
\s*
;

Это ни в коем случае не корректно, и должно работать. Но это могло представить начальную точку, если Вы готовы вставить некоторое усилие и улучшить его. Это может быть повреждено функциональными определениями, которые охватывают строки, аргумент указателя функции, МАКРОСЫ и вероятно много других вещей.

Примечание, что BNF может быть преобразованным в regex. Это будет большой, сложный regex, но это выполнимо.

10
ответ дан Jonathan Leffler 28 November 2019 в 23:34
поделиться

Допустим, у вас есть весь файл c, прочитанный в $buffer. * сначала создайте regexp, который заменяет все комментарии одинаковым количеством пробелов и переносов строк, чтобы позиции строк и столбцов не менялись. * создайте regexp, который может обрабатывать строку со скобками. * затем regexp, подобный этому, находит функции: (static|)\s+(\w+)\s*$parenthezized_regexp+*{

this reg exp does not handle functions which function definition uses preprocessor directives.

если вы перейдете на lex/yacc, вам придется комбинировать ansi c и препроцессорные грамматики для обработки директив препроцессора внутри определений функций

0
ответ дан 28 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: