| Call of string * Expression list
| And of Expression * Expression
| Or of Expression * Expression
let identifier = many1Satisfy isLetter
let expr, exprRef = createParserForwardedToRef()
(identifier .>> spaces .>> pchar '(' .>> spaces)
(sepBy expr (pchar ',' .>> spaces))
(fun name args -> Call(name, args))
identifier |>> Identifier;
between (pchar '(' .>> spaces) (pchar ')' .>> spaces) expr
let opp = new OperatorPrecedenceParser<Expression, unit, unit>()
opp.AddOperator(InfixOperator("|", spaces, 10, Associativity.Left, fun l r -> Or(l, r)))
opp.AddOperator(InfixOperator("&", spaces, 20, Associativity.Left, fun l r -> And(l, r)))
exprRef.Value <- attempt atomExpr <|> opp.ExpressionParser
run expr "(A & B) | F(C)"