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!")
            }
        }
    }
}

vimのsyntax

syn region  scalaString..___start=+"""+ end=+"""+

を足したら"""文字列をそこそこ見れるようになった。