2012-05-30 41 views
6

我有一個可用的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)} 
+0

你能給要考慮的空白製作的一些例子,不應該考慮空白製作的一些例子嗎? – sarnold

+0

用一個數據和一個空白敏感元素的例子更新了這個問題。 – malsmith

回答

2

不更明智打開第一分析器進入令牌分析器(詞法分析器,真的),使第二解析器讀取代替平原Char

+1

我還沒有看到這種方法的例子,但它聽起來更像我想要的。 – malsmith

相關問題