FParsec运算符优先级解析器与顺序的下一个解析器冲突

时间:2019-04-02 14:07:42

标签: fparsec

我有一个运算符在场解析器,用于解析数学表达式,类似于FParsec存储库中的计算器示例。

但是,序列中的下一个解析器将解析->,这会导致与减法运算符发生冲突。

一些代表性的代码是:

open FParsec

let ws = spaces
let str s = pstring s .>> ws
let number = pfloat .>> ws

let opp = new OperatorPrecedenceParser<float,unit,unit>()
let expr = opp.ExpressionParser
opp.TermParser <- number <|> between (str "(") (str ")") expr

opp.AddOperator(InfixOperator("+", ws, 1, Associativity.Left, (+)))
opp.AddOperator(InfixOperator("-", ws, 1, Associativity.Left, (-)))
opp.AddOperator(InfixOperator("*", ws, 2, Associativity.Left, (*)))
opp.AddOperator(InfixOperator("/", ws, 2, Associativity.Left, (/)))
opp.AddOperator(InfixOperator("^", ws, 3, Associativity.Right, fun x y -> System.Math.Pow(x, y)))
opp.AddOperator(PrefixOperator("-", ws, 4, true, fun x -> -x))

let completeExpression = expr .>> ws

let program =
    pipe3 completeExpression (str "->") completeExpression <| fun e1 _ e2 ->
        (e1, e2)

不适用于1+1 -> 1+2

我知道,如果我将str "->"更改为str "=>",那么类似1+1 => 1+2的东西就会起作用。

是否可以在运算符优先级分析器中添加前瞻功能?还是有其他解决方法?

谢谢!


编辑

我通过在后字符串解析器中为减法运算符添加一个notFollowedBy来对此进行排序。

let after = (notFollowedBy (str ">")) >>. ws
opp.AddOperator(InfixOperator("-", after, 1, Associativity.Left, (-)))

0 个答案:

没有答案