Поставили на одном проекте антимат на основе 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_]*)?
(?:
........
Т.е. для блока, начинающегося открытой скобкой немного плывет форматирование.
Поскольку жить и так стало легче, на этом и остановился. Теперь со словарем работать гораздо легче, а по завершении работы собрать все заново в единую строку — удалить пробелы и символы новой строки.
Подобный метод структурирования можно использовать при разработке или правке довольно сложных шаблонов — наглядность выше, а значит меньше шансов ошибиться.
