2017-12-20 7 views
3

このコードはこの入力( "WEEKEND-SUNDAY")を読み込み、 "SATURDAY"を返します。 "WEEKEND-SUNDAY"を入力しても "SATURDAY"を返します=>このパーサーは無視します最後に ')'fparsec OperatorPrecedenceParser:不完全なかっこを処理する方法

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

実行

run pExpr "MONDAY+(WEEKEND-SUNDAY)" 

出力

Success: set [Monday; Saturday] 

PR oblemが、それはまだ

Success: set [Monday; Saturday] 

を返す

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

である私はそれが失敗を表示したい。何か..

は、私が何かを逃したのですか?ありがとう

答えて

2

最後の2つの例では、pexprは、不一致の終了括弧まで入力ストリームを正常に解析した後に戻ります。したがって、最後の例では、結果は実際にはSuccess: set [Monday]ではなく、Success: set [Monday; Saturday]ではありません。

入力ストリームが完全に消費されていない場合は、エラーを強制的にeofパーサーを使用することができます

> run (pExpr .>> eof) "MONDAY)+WEEKEND-SUNDAY" 
Error in Ln: 1 Col: 7 
MONDAY)+WEEKEND-SUNDAY 
    ^
Expecting: end of input or infix operator 
関連する問題