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 件のコメント:
コメントを投稿