我有一个运算符在场解析器,用于解析数学表达式,类似于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, (-)))