(* This module defines the sorts of markup recognised by the LIGO
   lexer *)

module Region = Simple_utils.Region

(* A lexeme is piece of concrete syntax belonging to a token. In
   algebraic terms, a token is also a piece of abstract lexical
   syntax. Lexical units emcompass both markup and lexemes. *)

type lexeme = string

type t =
  Tabs      of int    Region.reg   (* Tabulations *)
| Space     of int    Region.reg   (* Space *)
| Newline   of lexeme Region.reg   (* "\n" or "\c\r" escape characters *)
| LineCom   of lexeme Region.reg   (* Line comments *)
| BlockCom  of lexeme Region.reg   (* Block comments *)
| BOM       of lexeme Region.reg   (* Byte-Order Mark for UTF-8 (optional) *)

type markup = t

(* Pretty-printing of markup

   The difference between [to_lexeme] and [to_string] is that the
   former builds the corresponding concrete syntax (the lexeme),
   whilst the latter makes up a textual representation of the abstract
   syntax (the OCaml data constructors).

   The result of [to_string] is escaped to avoid capture by the
   terminal.
*)

val to_lexeme : t -> lexeme
val to_string : t -> ?offsets:bool -> [`Byte | `Point] -> string
