package dolmen
A parser library for automated deduction
Install
Dune Dependency
Authors
Maintainers
Sources
dolmen-0.10.tbz
sha256=c5c85f77e3924f378e8d82f166eefe4131b4e041bf9cdeca467410f33c71fa61
sha512=42feb39d13cfdc8a2054abe85ccc47755f45059cda7d95e9261b5a9fd5c730f420732547b3fa19c4af059474f887ef78c119ab5933375a5ea2dbe888f65a3e4f
doc/src/dolmen_smtlib2_poly/print.ml.html
Source file print.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
(* This file is free software, part of dolmen. See file "LICENSE" for more information *) (* Printing of identifiers *) (* ************************************************************************* *) module L = Lexer exception Cannot_print of string let _cannot_print format = Format.kasprintf (fun msg -> raise (Cannot_print msg)) format (* lexical definitions taken from the smtlib specification *) let[@inline] is_whitespace c = let c = Char.code c in c = 9 (* tab *) || c = 10 (* line feed *) || c = 13 (* cariage return *) || c = 32 (* space *) let[@inline] is_printable c = let c = Char.code c in (32 <= c && c <= 126) || 128 <= c let is_quoted_symbol_char c = (is_whitespace c || is_printable c) && (c <> '|' && c <> '\\') let[@inline] is_letter = function | 'a'..'z' | 'A'..'Z' -> true | _ -> false let[@inline] is_digit = function | '0'..'9' -> true | _ -> false let[@inline] is_other_simple_symbol_chars = function | '~' | '!' | '@' | '$' | '%' | '^' | '&' | '*' | '_' | '-' | '+' | '=' | '<' | '>' | '.' | '?' | '/' -> true | _ -> false let is_simple_symbol_char c = is_letter c || is_digit c || is_other_simple_symbol_chars c (* symbol categorization *) type symbol = | Simple | Quoted | Unprintable let categorize_symbol s = match s with | "" -> Unprintable | "_" | "!" | "as" | "let" | "exists" | "forall" | "match" | "par" | "assert" | "check-sat" | "check-sat-assuming" | "declare-const" | "declare-datatype" | "declare-datatypes" | "declare-fun" | "declare-sort" | "define-fun" | "define-fun-rec" | "define-funs-rec" | "define-sort" | "echo" | "exit" | "get-assertions" | "get-assignment" | "get-info" | "get-model" | "get-option" | "get-proof" | "get-unsat-assumptions" | "get-unsat-core" | "get-value" | "pop" | "push" | "reset" | "reset-assertions" | "set-info" | "set-logic" | "set-option" -> Quoted | _ -> (* we are guaranteed that `s` is not the empty string *) if not (is_digit s.[0]) && (Dolmen_std.Misc.string_for_all is_simple_symbol_char s) then Simple else if Dolmen_std.Misc.string_for_all is_quoted_symbol_char s then Quoted else Unprintable let id fmt name = let aux fmt s = (* TODO: expose/add a cache to not redo the `categorize_symbol` computation each time *) match categorize_symbol s with | Simple -> Format.pp_print_string fmt s | Quoted -> Format.fprintf fmt "|%s|" s | Unprintable -> _cannot_print "symbol \"%s\" cannot be printed due to lexical constraints" s in match (name : Dolmen_std.Name.t) with | Simple s -> aux fmt s | Indexed { basename = _; indexes = [] } -> _cannot_print "indexed id with no indexes: %a" Dolmen_std.Name.print name | Indexed { basename; indexes; } -> let pp_sep fmt () = Format.fprintf fmt " " in Format.fprintf fmt "(_ %a %a)" aux basename (Format.pp_print_list ~pp_sep aux) indexes | Qualified _ -> _cannot_print "qualified identifier: %a" Dolmen_std.Name.print name
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>