2012-05-30 20 views
6

çalışmaz Scala çözümleyicim var, ancak çözüm istediğim kadar temiz değil. Sorun, yapımların bir kısmının belirtecin bir parçası olarak beyaz boşluğu dikkate alması gerektiğidir, ancak "daha yüksek" üretimler, boşlukları göz ardı edip atlayabilmelidir.Scala Ayrıştırıcı, bazen boşlukları atlar ve bazen de

Alt düzey ayrıştırıcıların genişletilmesi için tipik scala ayrıştırıcı modelini kullanırsam, skipWhitespace ayarları devralınır ve işler çok hızlı dağılır.

Genişletme yaklaşımını kullanmama konusunda daha iyi olacağımı düşünüyorum, bunun yerine üst düzey ayrıştırıcıların sınıfında bulunan düşük düzey ayrıştırıcısının bir örneğini kullanacağım - ancak bu işi nasıl yapacağımı bilmiyorum her örnek, yalnızca bir giriş karakteri akışı görecekti. İşte

düşük seviyeli ayrıştırıcı bir parçasıdır -

class VulgarFractionParser extends RegexParsers { 
    override type Elem = Char 

override val whiteSpace = "".r 

Sonra

class NumberParser extends VulgarFractionParser with Positional { 

gibi Ama bu noktada NumberParser açıkça sadece FractionParser gibi boşluk idare gerektiğini uzanır. NumberParser için hala oldukça idare edilebilir - ancak bir sonraki seviyeye kadar sadece 'un beyaz bir regexParser gibi bir ayırıcı olarak boşlukları kullanabileceğini üretebiliyorum.

bir örnek gibi bir şey olacaktır:

IBM 33.33/ 1200.00 
or 
IBM 33.33/33.50 1200.00 

bazen iki parça ile ayrılmış olan 2 değer bir "/" ve bazen sadece çizgiden sonra hiçbir şey tek bir bölümünü vardır (hatta bir çizgi içermeyen hiç de).

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

Beyaz boşlukları ve boşlukları dikkate almaması gereken bazı üretim örneklerini dikkate alması gereken bazı üretim örnekleri verebilir misiniz? – sarnold

+0

, verileri bir örnekle ve bu boşluklu hassas öğelerden biri ile güncelleştirdi. – malsmith

cevap

2

o (gerçekten, bir lexer) bir belirteç ayrıştırıcı içine ilk ayrıştırıcı çevirmek için daha mantıklı değil ve bunun yerine ikinci ayrıştırıcı bir okuma yapmak Char numaralı telefondan mı?

+1

Bu yaklaşımın bir örneğini görmedim, ancak istediğim gibi geliyor. – malsmith