2017-12-20 1 views
3

Dieser Code liest diesen Eingang "(WEEKEND-SUNDAY)" und dann zurück "SAMSTAG" aber Eingabe "WEEKEND-SONNTAG)" immer noch "SAMSTAG" => diesen Parser ignorieren letzte ')'fparsec OperatorPrecedenceParser: Umgang mit unvollständigen Klammern

let pDayOfWeekKeyWords = choice [ 
          pstring "MONDAY" ; 
          pstring "TUESDAY" ; 
          pstring "WEDNESDAY" ; 
          pstring "THURSDAY" ; 
          pstring "FRIDAY" ; 
          pstring "SATURDAY" ; 
          pstring "SUNDAY" ; 
          pstring "WEEKEND" ; 
          pstring "WEEKDAY" ; 
          pstring "ALL" ] 

let betweenParentheses p = 
    between (pstring "(") (pstring ")") p 

let opp = new OperatorPrecedenceParser<Set<DayOfWeek>,unit,unit>() 
let pExpr = opp.ExpressionParser 
let term = (betweenParentheses pExpr) <|> (pDayOfWeekKeyWords |>> (fun x -> 
    match x with 
    | "MONDAY" -> Set.ofList [DayOfWeek.Monday] 
    | "TUESDAY" -> Set.ofList [DayOfWeek.Tuesday] 
    | "WEDNESDAY" -> Set.ofList [DayOfWeek.Wednesday] 
    | "THURSDAY" -> Set.ofList [DayOfWeek.Thursday] 
    | "FRIDAY" -> Set.ofList [DayOfWeek.Friday] 
    | "SATURDAY" -> Set.ofList [DayOfWeek.Saturday] 
    | "SUNDAY" -> Set.ofList [DayOfWeek.Sunday] 
    | "WEEKDAY" -> Set.ofList [DayOfWeek.Monday ; DayOfWeek.Tuesday ; DayOfWeek.Wednesday;DayOfWeek.Thursday;DayOfWeek.Friday] 
    | "WEEKEND" -> Set.ofList [DayOfWeek.Saturday;DayOfWeek.Sunday] 
    | "ALL"-> Set.ofList [DayOfWeek.Monday ; DayOfWeek.Tuesday ; DayOfWeek.Wednesday;DayOfWeek.Thursday;DayOfWeek.Friday;DayOfWeek.Saturday;DayOfWeek.Sunday] 
    | _ -> failwith "ERROR MESSAGE")) 
opp.TermParser <- term 
opp.AddOperator(InfixOperator<Set<DayOfWeek>,unit,unit>("+", skipString "", 1, Associativity.Left, fun x y -> x + y)) 
opp.AddOperator(InfixOperator<Set<DayOfWeek>,unit,unit>("-", skipString "" , 1, Associativity.Left, fun x y -> x - y)) 

Lauf

run pExpr "MONDAY+(WEEKEND-SUNDAY)" 

Ausgang

Success: set [Monday; Saturday] 

pr oblem ist

run pExpr "MONDAY+WEEKEND-SUNDAY)" or run pExpr "MONDAY)+WEEKEND-SUNDAY" 

es noch

Success: set [Monday; Saturday] 

zurückkehren will ich es Failure zeigen: etwas ..

habe ich etwas verpasst? Danke

Antwort

2

In Ihren letzten beiden Beispielen pexpr kehrt zurück, nachdem der Eingabestream erfolgreich zu der nicht übereinstimmenden schließenden Klammer geparst wurde. Also, im letzten Beispiel ist das Ergebnis tatsächlich Success: set [Monday] nicht Success: set [Monday; Saturday].

Sie können die eof Parser verwenden, um einen Fehler zu erzwingen, wenn der Eingangsstrom vollständig verbraucht wurde nicht:

> run (pExpr .>> eof) "MONDAY)+WEEKEND-SUNDAY" 
Error in Ln: 1 Col: 7 
MONDAY)+WEEKEND-SUNDAY 
    ^
Expecting: end of input or infix operator 
Verwandte Themen