Fool Pool

ハマった記

シェルスクリプトによるデータフロープログラミング(1) -- カッコ対応チェック

概要

以前の投稿[1]で実装したカッコ対応チェックのプログラムをデータフローの処理[2]として実装する。

仕様

  • プログラムの第一引数にチェックするコード(テキストファイル)を指定する
  • コードのカッコの対応がとれている場合は、「Hey, your code is perfect!!」と表示する
  • 開きカッコが閉じカッコより多い場合は、「Oops, too many open parens (xx)!」と表示する(カッコ内には超過したカッコの数を表示する。)
  • 閉じカッコが多い場合も上記と同様とする

コード

# 入力ファイル中のカッコの対応付けが正しいかどうか判断する

# 入力文字列のカッコだけ抽出し、+1-1+1...のような数式に変換する
# 開きカッコ"(" => +1
# 閉じカッコ")" => -1
TERM=`cat $1			|\
 # コメント行の除去
 grep -v "^//" 			|\
 tr -d "\n"			|\
 # カッコ以外の文字を削除
 sed -e 's/[^()]//g' \
     -e 's/[(]/+1/g' \
     -e 's/[)]/-1/g'`

# 数式の和を計算する
RESULT=$((TERM))

# 結果を表示する
if [ $RESULT -eq 0 ]; then
  echo "Hey, your code is perfect!!"
elif [ $RESULT -gt 0 ]; then
  echo "Oops, too many open parens: $RESULT"
else
  echo "Oops, too may closed parens: $((-RESULT)) "
fi

解説

上記の例では、問題を下記のデータフローで解決している。

1. 入力コード
2. カッコのみ抽出した文字列
3. カッコを数式に置き換えた文字列
4. カッコの対応結果を表す数値

つまり、「1から4 を求める問題(=もとの問題)」を、「1から2を求める問題」「2から3を求める問題」「3から4を求める問題」に分割したことになる。