В дополнение к ответам и публикации того, что сработало для меня:
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
Можно реализовать синтаксический анализатор с помощью ANSI C yacc/lex грамматика .
Для одноразового осуществления Вы, вероятно, приложили бы все усилия путем запуска простой и рассмотрения кода, который необходимо просканировать. Выберите три худших заголовка, генерируйте regex или серию regexes, которые делают задание. Необходимо решить, ли и как Вы идете соглашение с комментариями, которые содержат объявления функции (и, действительно, с объявлениями функции, которые содержат комментарии). Контакт с:
extern void (*function(int, void (*)(int)))(int);
(который мог быть Стандартом C функция signal()
) жестко в regex из-за вложенных круглых скобок. Если Вы не имеете никаких подобных прототипов функции, приводите к таймауту потраченной работы, как иметь дело с ними, потраченное впустую время. Подобные комментарии относятся к указателям на многомерные массивы. Возможности состоят в том, что у Вас есть стилистические соглашения упростить Вашу жизнь. Вы не можете использовать C99 (C++) комментарии; Вы не должны кодировать вокруг них. Вы, вероятно, не помещаете многократные объявления в одну строку, или с или без общего типа - таким образом, Вы не должны иметь дело с этим.
extern int func1(int), func2(double); double func3(int); // Nasty!
Чтобы сделать это правильно, необходимо будет проанализировать согласно грамматике языка 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, но это выполнимо.
Допустим, у вас есть весь файл 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 и препроцессорные грамматики для обработки директив препроцессора внутри определений функций