2016-05-08 7 views
2

Ich versuche, einen einfachen Parser wie unten zu erstellen. Ich bin mir jedoch nicht sicher, warum sich der Kombinator-Parser beschweren möchte, dass er "floatingPointNumber" nicht erkennt, wenn das Format "Datumsangaben" vorliegt. Es erkennt, wenn es "Ident" istScala - Kombinator Parser falsch - repsep

Unten ist der Code mit Fehler.

Vielen Dank für Ihre Hilfe!

import scala.util.parsing.combinator.JavaTokenParsers 

class MyParser extends JavaTokenParsers { 
    def dates = repsep(date, ";") 
    def date = """\d{2}-[a-zA-Z]{3}-\d{4}""".r 
    def value = ident | dates | date | floatingPointNumber 
    def obj = "("~>repsep(value,",")<~")" 
} 
object MyParser extends MyParser { 
    def main(args: Array[String]): Unit = { 
    println(parseAll(obj, "(22-Jan-2016;09-Mar-2015)")) 
    println(parseAll(obj, "(22-Jan-2016;09-Mar-2015,blah3)")) 
    println(parseAll(obj, "(22-Jan-2016;09-Mar-2015,32)")) 
    } 
} 

[1.26] parsed: List(List(22-Jan-2016, 09-Mar-2015)) 
[1.32] parsed: List(List(22-Jan-2016, 09-Mar-2015), blah3) 
[1.26] failure: `)' expected but `3' found 
(22-Jan-2016;09-Mar-2015,32) 
         ^

Antwort

0

Sie wollen Unter der Annahme, mindestens einedate in dates anwesend zu sein, mit

def dates = rep1sep(date, ";") 

scheint das Problem zu beheben.

Ich glaube, der Grund dafür ist, dass die dates Parser der Lage ist, eine leere Zeichenfolge (das heißt „“ als Nil würde analysieren) zu übernehmen, und das bewirkt, dass der floatingPointNumber Teil des value Parsers nie ausgewertet werden. Wenn Sie dates so ändern kann es nicht eine leere Eingabe akzeptieren, gelingt es dem Parse:

def fixedDates = rep1sep(date, ";") 
def fixedValue = ident | fixedDates | date | floatingPointNumber 
def fixedObj = "("~>repsep(fixedValue,",")<~")" 

parseAll(fixedObj, "(22-Jan-2016;09-Mar-2015,32)") 
// MyParser.ParseResult[List[Object]] = 
// [1.29] parsed: List(List(22-Jan-2016, 09-Mar-2015), 32) 
+0

Danke, verpassen die Feinheit von mindestens einem! – brianinhk