パーサーの型

プログラミングHaskellより。 でもScalaで書いてみます。

適切な構文木の型Treeが与えられたとすると、パーサーはString -> Treeを持つ関数として表現できる。

type Parser = String => Tree

しかし、一般的にはパーサーがすべての文字列を使い切るとは限らない。 このため、消費しなかった文字列を返すように、パーサーの型を拡張する。

type Parser = String => (Tree, String)

同様に、構文の解析は常に成功するとは限らない。 失敗を扱えるように、パーサーの型をさらに拡張して、結果のリストを返すようにする。

Maybeを使えるって書いてあるけど、本のとおり、Seqでいきます。

type Parser = String => Seq[(Tree, String)]

最後に、パーサーが異なれば、異なる構文木を返すだろう。たとえば、数値パーサーは整数を返すだろう。そこで、返り値の型がTreeに限定されているのを抽象化し、型Parserの型変数にすると便利だ。

Scala的にはジェネリクス(って呼ばないのかな?)を使ってみます。

type Parser[T] = (String) => Seq[(T, String)]

リストの要素は、型Tの結果と、消費されなかった文字列との組である。

しょうじき、ここらへんで、どんな感じで返ってくるってこと????というのが想像が追いつきません。が次に進んでみます。