Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Шаблон для поиска в исходника СИ-подобных функций. Какой?
Форумы портала PHP.SU » PHP » Программирование на PHP » Шаблон для поиска в исходника СИ-подобных функций. Какой?

Страниц (1): [1]
 

1. freelsd - 16 Марта, 2015 - 13:27:43 - перейти к сообщению
Я так понимаю что задачу парсинга исходника с поиском функций простым регкспом не решить. Пробовал так:
$patt = '/([a-z ]*?)(\w+?)\s*(\(.*?\))\s*(\{.*?\})/s';

И вроде бы все хорошо, пока в сорце не встречается определение массива.
Вот такой код
CODE (htmlphp):
скопировать код в буфер обмена
  1. usigned  int main_my_main(int argc, char **argv){
  2.    int a=2,b=3,c;
  3.    int b[] ={1,32,3,4,535,35,3,114};
  4.    c=a+b;
  5. }
  6.  

превратится в такой на выходе:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. usigned  int main_my_main(int argc, char **argv){
  3.    int a=2,b=3,c;
  4.    int b[] ={1,32,3,4,535,35,3,114};


Жадный же поиск запихнет в тело функции все что попало. Регекспом тут не обойтись или можно что-нибудь придумать?
2. DeepVarvar - 16 Марта, 2015 - 13:54:57 - перейти к сообщению
Тащить жадным, и сматченные куски передавать ниже по цепочке рекурсивно. Но это тоже все Г, самый правильный путь - перебирать посимвольно, индексируя кол-во открытых-закрытых скобок и пр..

А вообще, нахрена? Не понял
3. freelsd - 16 Марта, 2015 - 14:13:49 - перейти к сообщению
DeepVarvar пишет:
Тащить жадным, и сматченные куски передавать ниже по цепочке рекурсивно. Но это тоже все Г, самый правильный путь - перебирать посимвольно, индексируя кол-во открытых-закрытых скобок и пр..

А вообще, нахрена? Не понял

Например есть несколько версий проекта на С/С++. Нужно показать какие функции менялись, и что в них изменилось.
4. DeepVarvar - 16 Марта, 2015 - 14:28:56 - перейти к сообщению
git, tig, svn, trac, redmine... не знакомо?
5. freelsd - 16 Марта, 2015 - 14:31:38 - перейти к сообщению
DeepVarvar пишет:
git, tig, svn, trac, redmine... не знакомо?

Нужно локальное решение. Да и со всеми особенностями git и svn я не знаком. А про остальные системы не слышал, лол. Но суть не в этом, а в том что нужно написать скрипт для такой задачи. Верным путем является, значит, индексирование скобок?
6. DeepVarvar - 16 Марта, 2015 - 14:32:51 - перейти к сообщению
freelsd пишет:
локальное решение
git <-> tig
7. OrmaJever - 16 Марта, 2015 - 14:37:51 - перейти к сообщению
freelsd пишет:
проекта на С/С++

Поверьте мне функции на С++ вы вряд ли распарсите регулярками. Там очень обширный синтаксис. Там могут быть и шаблоны
CODE (htmlphp):
скопировать код в буфер обмена
  1. int func< type >( type A ) ...

в методах классов могут быть операторы
CODE (htmlphp):
скопировать код в буфер обмена
  1. int operator()(int a) ...

так же шаблоны могут быть и в параметрах + неймспейсы
CODE (htmlphp):
скопировать код в буфер обмена
  1. int func( myClass< std::string> str ) ...

Про лямбды я вообще молчу. Гиблое это дело парсить С++ синтаксис Подмигивание
8. DeepVarvar - 16 Марта, 2015 - 15:06:54 - перейти к сообщению
Ты еще от так забыл:

CODE (c):
скопировать код в буфер обмена
  1. int blah(a, b)
  2.     const int a;
  3.     char *const b;
  4. {
  5.     ...
  6.     return 0;
  7. }
9. OrmaJever - 16 Марта, 2015 - 15:13:19 - перейти к сообщению
DeepVarvar, а ты уверен что это верный синтаксис? Что-то я первый раз такой вижу Растерялся
10. DeepVarvar - 16 Марта, 2015 - 15:17:36 - перейти к сообщению
100%, ток не помню по какому стандарту

CODE (htmlphp):
скопировать код в буфер обмена
  1. https://stuff.mit.edu/afs/sipb/project/tcl80/src/tcl8.0/compat/strstr.c
11. freelsd - 16 Марта, 2015 - 16:17:44 - перейти к сообщению
OrmaJever пишет:
freelsd пишет:
проекта на С/С++

Поверьте мне функции на С++ вы вряд ли распарсите регулярками. Там очень обширный синтаксис. Там могут быть и шаблоны
CODE (htmlphp):
скопировать код в буфер обмена
  1. int func< type >( type A ) ...

в методах классов могут быть операторы
CODE (htmlphp):
скопировать код в буфер обмена
  1. int operator()(int a) ...

так же шаблоны могут быть и в параметрах + неймспейсы
CODE (htmlphp):
скопировать код в буфер обмена
  1. int func( myClass< std::string> str ) ...

Про лямбды я вообще молчу. Гиблое это дело парсить С++ синтаксис Подмигивание


Ну гиблое не гиблое, может есть решения какие-то готовые?
12. DeepVarvar - 16 Марта, 2015 - 16:22:42 - перейти к сообщению
freelsd пишет:
есть решения какие-то готовые?
Выше же ответил.
13. OrmaJever - 16 Марта, 2015 - 16:29:57 - перейти к сообщению
freelsd пишет:
Ну гиблое не гиблое, может есть решения какие-то готовые?

готовое решение парнсинга функций С/C++ ? Я думаю очень вряд ли! Если вам нужно отслеживать изменения то сказал сказал DeepVarvar git. Создайте локальный репозиторий и заливайте изменения туда, но по-моему git это лучший вариант в данной ситуации, парсить C++ синтаксис это полный бред.
14. freelsd - 16 Марта, 2015 - 16:38:59 - перейти к сообщению
DeepVarvar пишет:
Выше же ответил.


OrmaJever пишет:
готовое решение парнсинга функций С/C++ ? Я думаю очень вряд ли! Если вам нужно отслеживать изменения то сказал сказал DeepVarvar git. Создайте локальный репозиторий и заливайте изменения туда, но по-моему git это лучший вариант в данной ситуации, парсить C++ синтаксис это полный бред.

Хорошо, спасибо.

 

Powered by ExBB FM 1.0 RC1