Russian Qt Forum
Апрель 18, 2024, 08:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Простая работа со строками  (Прочитано 3566 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июль 27, 2020, 07:26 »

Добрый день

Пример текста
Цитировать
out vec3 color_vsh;

#if USE_CUBE_MAP
   out mat4 invNormalMatrix_vsh;
#endif
Требуется

- найти все строки с первым словом out и содержащие слово с суффиксом _vsh. Для каждой найденной

a) сохранить саму строку  
b) сохранить имя с суффиксом _vsh, для примера выше color_vsh и invNormalMatrix_vsh
с) если первое слово в предыдущей строке #if, то сохранить слово после него, для примера выше USE_CUBE_MAP

В данном случае исходный текст пишу я сам, но все-таки интересно что делать в общем случае. Тогда может быть и так
Цитировать
#if (USE_CUBE_MAP == 1)
   out vec3 color_vsh;
   out mat4 invNormalMatrix_vsh;
#endif
Ну это так, "на будущее"

Спасибо
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Июль 27, 2020, 16:12 »

быстро на перле наваял: (на awk наверное тоже можно)
Код
Perl
#!/usr/bin/env perl
 
use strict;
 
my $prevLine;
while (<>)
{
 chomp $_;
 if (/^\s*out\s/ and /\s(\w+_vsh);/)
 {
   my @tokensToSave = ($_, $1);
   push @tokensToSave, $1 if $prevLine =~ /^\s*\#if\s+\(?(\w+)/;
   print "$_\n" for (@tokensToSave);
   print "\n"
 }
 $prevLine = $_
}
 

для файла
Код:
out vec3 color_vsh;

#if USE_CUBE_MAP
   out mat4 invNormalMatrix_vsh;
#endif

#if (USE_CUBE_MAP == 1)
   out vec3 color1_vsh;
#endif

дает вывод
Код:
out vec3 color_vsh;
color_vsh

   out mat4 invNormalMatrix_vsh;
invNormalMatrix_vsh
USE_CUBE_MAP

   out vec3 color1_vsh;
color1_vsh
USE_CUBE_MAP


конечно, можно поулучшать проверки, выводить в файл и т.д.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июль 28, 2020, 07:48 »

Круто (червона рута). Понимаю что тут "меня ждали", т.е. скриптовые языки на это и заточены, но все равно минимум кода впечатляет. Вопросы;

- что они считают "словом"? Ну или как "трактовать" символы что не буква и не цифра? Напр "#define" вроде слово. А "def#ine"? хз

- как это "подтянуть" к исходникам на плюсах? Возможно то же самое с предоставляемой Qt (пресловутой) "регуляркой" ?

Спасибо
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Июль 28, 2020, 16:26 »

- за «слово» можно брать то, что находится между \b (граница слов). У меня для простоты используется \s — пустые символы (пробелы, табуляции).
- буква и цифра (и подчеркивание) — \w, соответственно для НЕ будет \W
- да, Qtшные регулярки могут все то же самое, я тут никаких супер возможностей не использую. Ну только \ не забывать экранировать, либо использовать raw literal в С++11 — 6) в https://en.cppreference.com/w/cpp/language/string_literal
- подтянуть в смысле зашить в код или пробежать по исходным файлам? Если второе, то этому скрипту просто скормить пути к файлам как параметры: ./myscript.pl /path/to/file1 /path/to/file2 ...
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.062 секунд. Запросов: 22.