我有檢驗出的Scala解析器組合功能的一個簡單的圖書DSL的問題。Scala的解析器問題
首先有一本書類:
case class Book (name:String,isbn:String) {
def getNiceName():String = name+" : "+isbn
}
接下來是簡單的解析器:
object BookParser extends StandardTokenParsers {
lexical.reserved += ("book","has","isbn")
def bookSpec = "book" ~> stringLit ~> "has" ~> "isbn" ~> stringLit ^^ {
case "book" ~ name ~ "has" ~ "isbn" ~ isbn => new Book(name,isbn) }
def parse (s: String) = {
val tokens = new lexical.Scanner(s)
phrase(bookSpec)(tokens)
}
def test (exprString : String) = {
parse (exprString) match {
case Success(book) => println("Book"+book.getNiceName())
}
}
def main (args: Array[String]) = {
test ("book ABC has isbn DEF")
}
}
我得到了一系列試圖編譯這個錯誤的 - 其中一些似乎在嘗試解構互聯網上的其他例子時,我很陌生。例如,bookSpec函數與其他示例幾乎相同?
這是建立一個簡單的解析器這樣的最佳方式?
感謝
優秀的答案謝謝 - 已經歷所有的當前和未來的Scala的書籍,這是比兩個更好的答案我有哪些處理方式(Martin Odersky以及來自Wampler&Payne的) – ShaunL 2009-08-28 23:48:47