2012-03-23 85 views
1

前空格我試圖解析兩個整數的輸入,並且一些元件和端部:解析中的`elem`方法

import scala.util.parsing.combinator.JavaTokenParsers 

class X extends JavaTokenParsers { 
    lazy val elems = elem("wrong elem", "#WB-" contains _) 
    lazy val lists = repsep(rep(elems), ",") 
    lazy val p1 = int ~ int ~ lists 
    lazy val p2 = int ~ int ~ (whiteSpace ~> lists) 

    def go[A](p: Parser[A]) = parseAll(p, "1 2 WB#,---,BBB") match { 
    case NoSuccess(msg, _) => sys.error(msg) 
    case _ => 
    } 

    lazy val int: Parser[Int] = 
    wholeNumber ^^ { 
     try _.toInt catch { 
     case e: NumberFormatException => sys.error("invalid number") 
     } 
    } 
} 

一個例子的輸入在方法go給出。 Ints和最後的元素必須用空格分隔。但是這隻適用於Ints而不適用於元素。當我在

val x = new X 
x go x.p1 

鍵入我收到以下錯誤:

java.lang.RuntimeException: string matching regex `\z' expected but `W' found 

但是,當我在

x go x.p1 

型我得到:

java.lang.RuntimeException: string matching regex `\s+' expected but `W' found 

在我想結束有一個Parser[Int ~ Int ~ List[List[Char]]]。爲什麼在elem前插入空格不起作用?我怎樣才能使這個代碼工作?

回答

2

通過正則表達式解析器只需更換elems的:

import scala.util.parsing.combinator.JavaTokenParsers 

class X extends JavaTokenParsers { 

lazy val elems = "[#WB-]".r 
lazy val lists = repsep(rep(elems), ",") 
lazy val p1 = int ~ int ~ lists 

def go[A](p: Parser[A]) = parseAll(p, "1 2 WB#,---,BBB") match { 
case NoSuccess(msg, _) => sys.error(msg) 
case _ => 
} 

lazy val int: Parser[Int] = 
wholeNumber ^^ { 
try _.toInt catch { 
    case e: NumberFormatException => sys.error("invalid number") 
    } 
} 
} 

我已刪除P2因爲現在是沒有用的

+0

謝謝'如預期spaces'工作。但是爲什麼它在'whiteSpace'時不起作用? – sschaef 2012-03-23 15:37:13

+0

我從不直接使用whiteSpace(默認值爲正則表達式= [\ s] +),解析器使用它自動跳過空白(可以通過覆蓋skipWhiteSpace覆蓋val skipWhitespace = false來禁用它) – fp4me 2012-03-23 16:34:13

+0

I瞭解'whiteSpace'的功能以及它的定義。但我不明白爲什麼在明確使用時會導致錯誤。爲什麼當它不能再讀取輸入並繼續下一個解析器時它不會停止? – sschaef 2012-03-23 17:21:44