こんにちは。
いつもお世話になっております。
首題の件ですが、質問の前提を説明するために長文になりました。何卒、ご了承ください。
質問の趣旨としては、後述するある問題(要件)を解決するために、
(1) 情報科学の何らかの分野の教科書に載っているような、よく知られている定石となっている
アルゴリズムやデータ構造があればご教示ください。
⇒ 定石というのは、たとえば、「あるオブジェクトの配列をソートしたいときは、クイックソート
という定石を使える。(なので、そのオブジェクト(のクラス)に比較演算子を定義すればよい。)」
というのと同様に、という趣旨です。
(2) 定石といえるほどの知られ方でなくても、その問題(要件)を解決するには、こういうデータ構造
(やクラス設計)なら良質なコードとして実装できるというようなアイディアがあれば、ぜひ
ご教示ください。(「こうすればうまくいく気がする」レベルでもかまいません。)
というものになります。
まず、説明の便宜上、問題(要件)を満たすプログラムの名前を、
IF-Reducer(IFブロック減少器)
と称します。
このように称する理由は、以降の説明にある、仕様(9)で明らかになります。
(もっとぴったりした名前があるかもしれませんが、とりあえず、以降の説明では
このように称します。)
IF-Reducerの仕様は以下です。
仕様(1):2つのテキストファイルAとBを入力として受け取ります。
仕様(2):1つのテキストファイルCを出力します。
仕様(3):入力として受け取る2つのファイルのうちの1つAと、出力されるCは、通常の
可読な文字(半角英数字+全角文字)による文字列が並んでいるテキストの中に
IFタグと呼ばれる制御構文が挿入されています。
仕様(4):AとCは、上記のように、通常のテキストに制御構文が入っていることから、
便宜上、「テンプレートファイル」または単に「テンプレート」と呼びます。
仕様(5):AとCに挿入されるIFタグは以下の形式をとります。
**{if $<変数>}**
または、
{/if}
・ただし、上記で、<変数>は、通常のプログラミング言語での識別子として
有効な文字列を指定します。
・タグの文字列としての形式は、Smartyの{if と類似するものです。
・以下はテンプレートファイルの一例です。
lang
1打ち合わせメモ 2{if $header} 3 {if $date}2015/05/20{/if} 4新プロジェクトの体制について 5{/if} 6参加者:田中、鈴木
上記のように、{if と {/if がプログラミング言語のように入れ子になって
ブロック構造を構成します。
仕様(6):入力されるもう1つのファイルBは以下のような形式の行
$<変数名>=(true|false)
が0以上並んでいるものとします。また、= の前後には任意の数のタブおよびスペースを
許容します。
説明の便宜上ファイルBのことを変数定義ファイル(または単に変数ファイル)と呼びます。
以下は変数定義ファイルの一例です。
変数定義ファイル(例1)
lang
1$header = true 2$date = false
仕様(7):IF-Reducerは、上記で例示したテンプレートファイルと、変数定義ファイルを読み、
以下を出力します。
lang
1打ち合わせメモ 2 3新プロジェクトの体制について 4参加者:田中、鈴木
上記のように、IF-Reducerは、テンプレートAに出現する {if タグの<変数>を
変数定義ファイルから trueなのかfalseなのかを解決し、かつ、そのifを囲む
(親の)ifブロックがあれば、その真偽も考慮して、{ifブロックで囲まれる部分を
出力テンプレートCに出力するかどうかを決めます。
仕様(8):もし変数ファイルに記述されてしない変数が{if タグに出現した場合、対応する
閉じタグ {/if とともに、未解決のタグとして、Cに出力されます。
たとえば上記の例で、変数ファイルに $date=false がなく
変数定義ファイル(例2)
lang
1$header = true
となっている場合、出力されるテンプレートC は
lang
1打ち合わせメモ 2 {if $date}2015/05/20{/if $date} 3新プロジェクトの体制について 4参加者:田中、鈴木
となるものとします。
仕様(9):上記のように、IF-Reducerによって、「Aに含まれる{if ・・{/if タグが
完全になくなるとは限らないが少なくとも減らされて、Cとして出力する。」ことから、
当該プログラムを 「IFブロック減少器」の意図で
IF-Reducer
としました。
仕様(10):入力されるテンプレートの空白文字(改行、スペース、タブ)については
出力時に、適切に調整されて出力されます。
(この”適切に”の具体的な内容は、本質問の主旨ではないので、説明を割愛します。)
IF-Reducer の説明は以上になりますが、仕様説明として不足な部分があれば
ぜひご指摘ください。
上記をふまえて、冒頭に書きましたとおり、質問としては
以下の2点です。
(1)上記のような、制御構造としてifブロックを含むテキストファイル(典型的なものは
プログラムコードですが。)を処理する、よく知られた方法はありますか?
if <変数> 、あるいは、もっと一般的にいって if <式> (に加えて、必要によっては、
elseifやelse )によって構成される if ブロックを適切に処理するための定石のような
手法(アルゴリズム、データ構造、クラス設計、それらを設計するためのコンセプトなど)
があれば、ご教示頂きたいです。
あるいは、「こういう本(or サイト)のこの辺あたりに書いてある」といった
ご示唆でも大変ありがたいです。
※なお、上記で想定しているIF-Reducer では、{if が評価する対象として、<式>ではなくて
<変数>としているのは、<式>にすると評価のための実装が大変そうだ、という
単にそれだけの理由です。
(2)(ソートにおけるクイックソートのような)定石というレベルではなくても
「こういうデータ構造(やクラス設計)なら良質なコードになる(気がする)」
というようなアイディアがあればぜひご教示ください。
コードのスニペットで示して頂ければ嬉しいですが、単に考え方を記述した文章でも
ありがたいです。
以上です。
皆様のお知恵を拝借できましたら幸いです。
よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/20 08:46