我有一個可用的Scala解析器,但解決方案並不像我想的那麼幹淨。問題在於一些產品必須將空白視爲令牌的一部分,但「更高級」的產品應該能夠忽略/跳過空白。Scala解析器有時會跳過空格,有時不會
如果我使用延伸的下水平解析器的典型的Scala解析器圖案,然後skipWhitespace設置繼承,事情變得混亂很快。
我想我最好不要使用擴展方法,而是在較高級別的解析器類中使用低級解析器的實例 - 但我不確定如何完成這項工作,例如每個實例只會看到一個輸入字符流。
這裏是最低級別的解析器的一部分 -
class VulgarFractionParser extends RegexParsers {
override type Elem = Char
override val whiteSpace = "".r
然後我伸出,像
class NumberParser extends VulgarFractionParser with Positional {
但在這一點上,NumberParser必須明確處理空白就像FractionParser。對於NumberParser它仍然是非常便於管理 - 但在上一級我真的希望能夠只定義品生產,做使用空格作爲就像一個正常的regexParser會做一個分離器。
一個例子是這樣的:
IBM 33.33/ 1200.00
or
IBM 33.33/33.50 1200.00
的第二值有時包括兩個部分由分離的「/」,有時僅具有斜線後什麼也沒有一個單一的部件(或甚至不含有斜線完全)。
def bidOrAskPrice = ("$"?) ~> (bidOrAskPrice1 | bidOrAskPrice2 | bidOrAskPrice3)
def bidOrAskPrice1 = number ~ ("/".r) ~ number ~ (SPACES) ^^ {
case a ~ slash ~ b ~ sp1 => BidOrAsk(a,Some(b))
}
def bidOrAskPrice2 = (number ~ "/" ~ (SPACES)) ^^ { case a ~ slash ~ sp => BidOrAsk(a,None) }
def bidOrAskPrice3 = (number ~ (SPACES?)) ^^ { case a ~ sp => BidOrAsk(a , None)}
你能給要考慮的空白製作的一些例子,不應該考慮空白製作的一些例子嗎? – sarnold
用一個數據和一個空白敏感元素的例子更新了這個問題。 – malsmith