【问题标题】:fparsec OperatorPrecedenceParser : How to deal with incomplete parenthesesfparsec OperatorPrecedenceParser:如何处理不完整的括号
【发布时间】:2017-12-20 08:15:19
【问题描述】:

此代码将读取此输入“(WEEKEND-SUNDAY)”,然后返回“SATURDAY” 但输入 "WEEKEND-SUNDAY)" 仍然返回 "SATURDAY" => 这个解析器忽略最后一个')'

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]

问题是

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

它仍然返回

 Success: set [Monday; Saturday]

我希望它显示失败:某事..

我错过了什么吗?谢谢

【问题讨论】:

    标签: parsing f# dayofweek fparsec


    【解决方案1】:

    在后两个示例中,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      相关资源
      最近更新 更多