2016-05-08 1 views
2

私は以下のように単純なパーサを作成しようとしています。しかし、なぜ '日付'形式があるときに 'floatingPointNumber'を認識しないとコンビネータパーサが不平を言っているのか分かりません。それは 'ident'であることを認識しますScala - コンビネータパーサが正しくありません - repsep

以下はエラーのあるコードです。

多くのご協力ありがとうございます!

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) 
         ^

答えて

0

def dates = rep1sep(date, ";") 

を使用して、問題を解決するよう、あなたは少なくとも一つdatedatesに存在するようにしたいと仮定。

私は理由が(つまり「」Nilとして解析します)datesパーサは空の文字列を受け入れることができるということであり、それが評価されることはありませんするvalueパーサのfloatingPointNumber一部の原因となると考えています。あなたがdatesを変更した場合ので、それが空の入力を受け入れることができない、解析が成功:

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

おかげで、少なくとも一つの繊細を欠場! – brianinhk

関連する問題