Поставили на одном проекте антимат на основе Antimat.pm Ильи Солдаткина.
Через некоторое время возникла необходимость его подправить. Было решено, что слово «фиг» матом считать не будем и заказчик захотел добавить еще пару слов. Как быть? Базовый шаблог модуля — строка длиной 12706 символов. Ходить по ней вдоль и что-то искать-править — врагу не пожелаешь.
При беглом изучении шаблона выяснил, что он разбит на отдельные блоки для разных словоформ, которые перечисляются через логическое ИЛИ (| — pipe). Каждый блок так-же может состоять из нескольких подблоков-альтернатив, для группировки и перечисления которых используются круглые скобки и тоже ИЛИ.
Пришла мысль представить данный шаблон в более удобочитаемом виде. Старый проверенный рецепт — структурное программирование — оператор с новой строки, вложенные блоки со смещением вправо. Чтобы не накосячить при ручноим разбиении и следуя старому правилу «лень — двигатель прогресса», на коленке набросал простенький парсер:
В итоге вмесло «змеи» вида:
получил нечто более читабельное:
Результат конечно не идеален, при переходе к новому блоку есть глюки вида:
Т.е. для блока, начинающегося открытой скобкой немного плывет форматирование.
Поскольку жить и так стало легче, на этом и остановился. Теперь со словарем работать гораздо легче, а по завершении работы собрать все заново в единую строку — удалить пробелы и символы новой строки.
Подобный метод структурирования можно использовать при разработке или правке довольно сложных шаблонов — наглядность выше, а значит меньше шансов ошибиться.
Через некоторое время возникла необходимость его подправить. Было решено, что слово «фиг» матом считать не будем и заказчик захотел добавить еще пару слов. Как быть? Базовый шаблог модуля — строка длиной 12706 символов. Ходить по ней вдоль и что-то искать-править — врагу не пожелаешь.
При беглом изучении шаблона выяснил, что он разбит на отдельные блоки для разных словоформ, которые перечисляются через логическое ИЛИ (| — pipe). Каждый блок так-же может состоять из нескольких подблоков-альтернатив, для группировки и перечисления которых используются круглые скобки и тоже ИЛИ.
Пришла мысль представить данный шаблон в более удобочитаемом виде. Старый проверенный рецепт — структурное программирование — оператор с новой строки, вложенные блоки со смещением вправо. Чтобы не накосячить при ручноим разбиении и следуя старому правилу «лень — двигатель прогресса», на коленке набросал простенький парсер:
#include <stdio.h> void new_line(int d) { int i; putc('\n',stdout); for(i=0;i<d;i++)putc(' ',stdout); } int main(void) { int d=0; char c,l=0; while(!feof(stdin)){ c=getc(stdin); if(c=='('){d+=2;new_line(d);} putc(c,stdout);l++; if(c==')'){d-=2;if(d<=0)l=0;} if(c=='|'){new_line(d);} } }
В итоге вмесло «змеи» вида:
a[\W_]*s[\W_]*s(?:[\W_]*e[\W_]*s)?|f[\W_]*u[\W_]*c[\W_]*k(?:[\W_]*i............
получил нечто более читабельное:
a[\W_]*s[\W_]*s (?:[\W_]*e[\W_]*s)?| f[\W_]*u[\W_]*c[\W_]*k (?:[\W_]*i[\W_]*n[\W_]*g)?| ..................
Результат конечно не идеален, при переходе к новому блоку есть глюки вида:
........ (?:[\W_]*[иiu])?)?))| (?:[нhn][\W_]*[еe][\W_]*)? (?: ........
Т.е. для блока, начинающегося открытой скобкой немного плывет форматирование.
Поскольку жить и так стало легче, на этом и остановился. Теперь со словарем работать гораздо легче, а по завершении работы собрать все заново в единую строку — удалить пробелы и символы новой строки.
Подобный метод структурирования можно использовать при разработке или правке довольно сложных шаблонов — наглядность выше, а значит меньше шансов ошибиться.