let boolean_expression_of_string str =
let lexify str =
let keywords = ["("; ")"; "¬"; "∧"; "∨"] in
make_lexer keywords (Stream.of_string str)
and parse lexer =
let rec binary_expression =
let rec loop left_expr =
parser
| [< 'Kwd "∧"; right_expr = unary_expression; s >] -> loop (And [left_expr; right_expr]) s (* Syntax error here characters 10-11 *)
| [< 'Kwd "∨"; right_expr = unary_expression; s >] -> loop (Or [left_expr; right_expr]) s
| [< >] -> left_expr
in
parser [< left_expr = unary_expression; s >] -> loop left_expr s
and unary_expression =
parser
| [< 'Kwd "¬"; expr = unary_expression >] -> Not expr
| [< 'Kwd "("; expr = binary_expression; 'Kwd ")" >] -> expr
| [< 'Int n >] -> Var n
in
binary_expression lexer
in
parse (lexify str)
;;