mqoパーサ
とりあえず
- mqoファイル開く
- 1行ずつ読み込む
- Scene, Material, Objectで分岐する
- Eofが来たら終わり
まで書いてみた。
正規表現でmatchするを学んだ。
caseで取り出すのをExtractor言うらしい。
しかし、英語でHogeFugaするものをHogeFugaorとか言うときに和訳して最後に"子"ってつける言語感覚が
どうも馴染めないな。他に言葉が無い場合が多いのは判るんだけど。
演算子(operator)は慣れたが。
識別子(identifier)も慣れてた。矢張り慣れの問題なのか。
python的なクラスの作り方だと関数型スタイルのオブジェクトにならないな。
寝る。
import java.io.File import scala.io.Source class MqoLoader(path :String) { def _parseScene(iter :Iterator[String]) { for(line <- iter){ if(line=="}"){ return true } } } def _parseMaterials(iter :Iterator[String], count: Int){ for(line <- iter){ if(line=="}"){ return true } } } def _parseObject(iter :Iterator[String], name: String) { println("Object:", name) for(line <- iter){ if(line=="}"){ return true } } } def load():Boolean = { try{ val iter=Source.fromFile(path).getLines // check first line if(iter.next!="Metasequoia Document"){ return false } // check second line if(iter.next!="Format Text Ver 1.0"){ return false; } // each line val MaterialChunk="""Material (\d+) \{""".r val ObjectChunk="""^Object "([^"]+)" \{""".r for(line <- iter if line!=""){ line match { case "Eof" => return true case "Scene {" => _parseScene(iter) case MaterialChunk(count) => _parseMaterials( iter, count toInt) case ObjectChunk(name) => _parseObject(iter, name) case default => println("unknown chunk:", default) } } return false; } catch { case ex :java.io.FileNotFoundException => println(ex toString) return false; } } } object MqoLoader { def main(args :Array[String]){ for(arg <- args){ println("load: "+arg) val loader=new MqoLoader(arg) if(loader.load()){ println("success!") } else{ println("failed!") } } } }