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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
freelsd
Отправлено: 16 Марта, 2015 - 13:27:43
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




Я так понимаю что задачу парсинга исходника с поиском функций простым регкспом не решить. Пробовал так:
$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};


Жадный же поиск запихнет в тело функции все что попало. Регекспом тут не обойтись или можно что-нибудь придумать?
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Марта, 2015 - 13:54:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Тащить жадным, и сматченные куски передавать ниже по цепочке рекурсивно. Но это тоже все Г, самый правильный путь - перебирать посимвольно, индексируя кол-во открытых-закрытых скобок и пр..

А вообще, нахрена? Не понял
 
 Top
freelsd
Отправлено: 16 Марта, 2015 - 14:13:49
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




DeepVarvar пишет:
Тащить жадным, и сматченные куски передавать ниже по цепочке рекурсивно. Но это тоже все Г, самый правильный путь - перебирать посимвольно, индексируя кол-во открытых-закрытых скобок и пр..

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

Например есть несколько версий проекта на С/С++. Нужно показать какие функции менялись, и что в них изменилось.
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Марта, 2015 - 14:28:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




git, tig, svn, trac, redmine... не знакомо?
 
 Top
freelsd
Отправлено: 16 Марта, 2015 - 14:31:38
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




DeepVarvar пишет:
git, tig, svn, trac, redmine... не знакомо?

Нужно локальное решение. Да и со всеми особенностями git и svn я не знаком. А про остальные системы не слышал, лол. Но суть не в этом, а в том что нужно написать скрипт для такой задачи. Верным путем является, значит, индексирование скобок?
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Марта, 2015 - 14:32:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




freelsd пишет:
локальное решение
git <-> tig
 
 Top
OrmaJever Модератор
Отправлено: 16 Марта, 2015 - 14:37:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




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 ) ...

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


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Марта, 2015 - 15:06:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Ты еще от так забыл:

CODE (c):
скопировать код в буфер обмена
  1. int blah(a, b)
  2.     const int a;
  3.     char *const b;
  4. {
  5.     ...
  6.     return 0;
  7. }
 
 Top
OrmaJever Модератор
Отправлено: 16 Марта, 2015 - 15:13:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




DeepVarvar, а ты уверен что это верный синтаксис? Что-то я первый раз такой вижу Растерялся


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Марта, 2015 - 15:17:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




100%, ток не помню по какому стандарту

CODE (htmlphp):
скопировать код в буфер обмена
  1. https://stuff.mit.edu/afs/sipb/project/tcl80/src/tcl8.0/compat/strstr.c
 
 Top
freelsd
Отправлено: 16 Марта, 2015 - 16:17:44
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




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 ) ...

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

Ну гиблое не гиблое, может есть решения какие-то готовые?
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Марта, 2015 - 16:22:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




freelsd пишет:
есть решения какие-то готовые?
Выше же ответил.
 
 Top
OrmaJever Модератор
Отправлено: 16 Марта, 2015 - 16:29:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




freelsd пишет:
Ну гиблое не гиблое, может есть решения какие-то готовые?

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


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
freelsd
Отправлено: 16 Марта, 2015 - 16:38:59
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




DeepVarvar пишет:
Выше же ответил.


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

Хорошо, спасибо.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB