Как стать автором
Обновить

Структурное шаблоностроение на Perl

Время на прочтение2 мин
Количество просмотров688
Поставили на одном проекте антимат на основе Antimat.pm Ильи Солдаткина.
Через некоторое время возникла необходимость его подправить. Было решено, что слово «фиг» матом считать не будем и заказчик захотел добавить еще пару слов. Как быть? Базовый шаблог модуля — строка длиной 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_]*)?
  (?:
........


Т.е. для блока, начинающегося открытой скобкой немного плывет форматирование.
Поскольку жить и так стало легче, на этом и остановился. Теперь со словарем работать гораздо легче, а по завершении работы собрать все заново в единую строку — удалить пробелы и символы новой строки.

Подобный метод структурирования можно использовать при разработке или правке довольно сложных шаблонов — наглядность выше, а значит меньше шансов ошибиться.
Теги:
Хабы:
Всего голосов 1: ↑1 и ↓0+1
Комментарии1

Публикации