2015年7月28日火曜日

Scalaで学ぶ関数脳入門 パーサー

P332 リスト7 一から実装した簡単な字句解析器の例が出ていた。説明が簡潔なため、よく考えないとわからなかった。

case class Token(val tokenType:String,val value:String){
 override der toString ="["+tokenType+":" "+value+"]"
}

class simpleLexer(input:Stirng){
 val OPERATOR="OPERATOR"
 val NUMBER="NUMBER"
val EOF="EOF"
var reader =new CarSequenceReader(input)

def netxToken():Token=|
 while(!readre.atEnd){
  reader.first match {
   case c:Char if (c=='+' || c=='-")
    => return new Token(OPERATOR,takeFirst)
   case ....................
   case c:Char if (c==' ' || c== '\t'...) =>dump
   ..................

}
.......................


def takeFirst()={
val first =reader.first
reader=reader.drop(1)
first.toString
}
これは、先頭の文字を返すが、その先頭の文字を文字シーケンス(reader)から削除するらしい。
ただ、よくわからないのは、これがdumpの中で使われていて、dumpの返り値はUnitであること。dumpはStringを返すこともあるんだけど、:Unitとすれば、Stringは無視されるんということか?nextTokenの通常文字をみつけたときは、 Token(OPERATOR,takeFirst)というように、takeFirstの返り値Stringを使っているようだが。

def dump():Unit=reader.first match {
 case c:Char if (c==' ' || c== '\t' || c=='\r' || c=='\n')
 => takeFirst ;dump
case _ =>
}
これは、空白を削除する。最初の文字が、空白、タブ、改行等なら、その最初の文字をtakeして、dumpの再帰で、空白等を削除するかチェック(空白等が連続してる場合もあるから)していく。空白等がなくなれば、何もせず、もとにもどるということのようだ。


0 件のコメント:

コメントを投稿