Diary?

2008-06-02
Mon

(22:52)

「風の症状が出始めたのは土曜日、日曜日はきっちり睡眠取ったし大丈夫だろう」「治ってなくても一日ぐらいもつだろう」などというバカな発想で出社したら見事に仕事中に症状悪化。半ば無理やり帰させられて、そんで医者行った後今までずっと寝てた。我ながら何やってんだ。これで明日中にやんなきゃいけない仕事が増えたなあ。まあ、二つあったバカでかい課題の一つは今日の内にケリがついたからいいか。

で、すごくどうでもいいけど、プログラミング言語というか DSL の構文解析って、凝ったことしないなら全然難しくないんだよな。例えば次のような文法の言語を考える。

def func {
  foo = "foo bar";
  if condition {
    var = some_function arg1, arg2
  } else {
    var = another_function arg1,
                           arg2,
                           arg3,
                           arg4;
  }
}

とりあえずこの言語はかなり特殊な目的のための DSL なんで、以下のような制約がある。

  • 演算子は代入と比較のみ
  • 関数呼び出しに括弧とか付けない
    • なので関数呼び出しのネストは出来ない。func1(func2()) なんてのは無理
  • 行末のセミコロンは省略不可
  • ブレースの省略は不可

こういう制限があれば、もう何も考えずに

  1. ブレースが出てくるまでトークンを読んでいく
  2. ブレースが出てきたら状態をシフト
  3. 対応するブレースが出てきたら、ブレースで囲われた中に対して再帰的に処理
  4. ブロック構造の解析の最中に、式の解析も行う

という風に処理していけば、難しい事は何一つ考えずに済む。処理した後にキャッシュするんで、多少非効率でもそこまで問題ないしな。最初は JavaCC を使おうかな思ってたけど、この程度だったら yacc の類を持ち出すまでもないなあ。それでも文字列処理を Java でゴリゴリ書くのは面倒なんで Jython で書いちまったけど。俺以外に Python 技術者がいないからそのうち全部 Java で書き直す事にはなると思うけど、どうせプロトタイプだからいいか。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。