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) ;;