Perlでの構造テンプレートの構築

彼らは、Ilya SoldatkinのAntimat.pmに基づくアンチマットを1つのプロジェクトに載せました。

しばらくして、修正する必要がありました。 「fig」という単語はわいせつとは見なされず、顧客はさらにいくつかの単語を追加することを希望することが決定されました。 になる方法 基本モジュールテンプレートは、12706文字の文字列です。 それに沿って歩いて何かを探してください-あなたは敵を望みません。

テンプレートの簡単な調査中に、さまざまな単語形式の個別のブロックに分割されていることがわかりました。これらは論理OR(|-パイプ)でリストされます。 各ブロックは、いくつかの代替サブブロックで構成することもできます。これらのサブブロックは、使用する括弧のグループ化とリスト、およびORです。

このアイデアは、このテンプレートをより読みやすい形式で提示するようになりました。 古い実績のあるレシピ-構造プログラミング-新しい行演算子、右側にオフセットを持つネストされたブロック。 手動のパーティション分割を混乱させず、「怠oldは進行のエンジンです」という古いルールに従うために、単純なパーサーがひざまずきました:



  #include <stdio.h>
ボイド
 new_line(int d)
 {
   int i;
   putc( '\ n'、stdout);
   for(i = 0; i <d; i ++)putc( ''、stdout);
 }
 int
メイン(ボイド)
 {
   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 _] * [and iu])?)?))|

   (?:[hn] [\ W _] * [ee] [\ W _] *)?
   (?:
 ........




つまり オープンブラケットで始まるブロックの場合、書式設定は少し変わります。

この方法で生活が楽になったので、そこでやめました。 これで、辞書の操作がはるかに簡単になり、作業が完了すると、すべてを新たに1行で収集するようになりました-スペースと改行文字を削除します。



かなり複雑なテンプレートを開発または編集する際にも、同様の構造化方法を使用できます-視認性が高いため、ミスの可能性が低くなります。



All Articles