45 lines
1.4 KiB
OCaml
45 lines
1.4 KiB
OCaml
|
module Region = Simple_utils.Region
|
||
|
|
||
|
type lexeme = string
|
||
|
|
||
|
type t =
|
||
|
Tabs of int Region.reg
|
||
|
| Space of int Region.reg
|
||
|
| Newline of lexeme Region.reg
|
||
|
| LineCom of lexeme Region.reg
|
||
|
| BlockCom of lexeme Region.reg
|
||
|
| BOM of lexeme Region.reg
|
||
|
|
||
|
type markup = t
|
||
|
|
||
|
(* Pretty-printing *)
|
||
|
|
||
|
let sprintf = Printf.sprintf
|
||
|
|
||
|
let to_lexeme = function
|
||
|
Tabs Region.{value;_} -> String.make value '\t'
|
||
|
| Space Region.{value;_} -> String.make value ' '
|
||
|
| Newline Region.{value;_}
|
||
|
| LineCom Region.{value;_}
|
||
|
| BlockCom Region.{value;_}
|
||
|
| BOM Region.{value;_} -> value
|
||
|
|
||
|
let to_string markup ?(offsets=true) mode =
|
||
|
let region, val_str =
|
||
|
match markup with
|
||
|
Tabs Region.{value; region} ->
|
||
|
let lex = String.make value '\t' |> String.escaped
|
||
|
in region, sprintf "Tabs \"%s\"" lex
|
||
|
| Space Region.{value; region} ->
|
||
|
region, sprintf "Space \"%s\"" (String.make value ' ')
|
||
|
| Newline Region.{value; region} ->
|
||
|
region, sprintf "Newline \"%s\"" (String.escaped value)
|
||
|
| LineCom Region.{value; region} ->
|
||
|
region, sprintf "LineCom \"%s\"" (String.escaped value)
|
||
|
| BlockCom Region.{value; region} ->
|
||
|
region, sprintf "BlockCom \"%s\"" (String.escaped value)
|
||
|
| BOM Region.{value; region} ->
|
||
|
region, sprintf "BOM \"%s\"" (String.escaped value) in
|
||
|
let reg_str = region#compact ~offsets mode
|
||
|
in sprintf "%s: %s" reg_str val_str
|