mte/unikernel/duniverse/dune_/vendor/opam-file-format/opamParser.ml
2025-11-11 02:07:51 +01:00

108 lines
3.9 KiB
OCaml

(**************************************************************************)
(* *)
(* Copyright 2016-2018 OCamlPro *)
(* *)
(* All rights reserved. This file is distributed under the terms of the *)
(* GNU Lesser General Public License version 2.1, with the special *)
(* exception on linking described in the file LICENSE. *)
(* *)
(**************************************************************************)
(** Generic glue functions *)
let parse_from_string parse_fun str filename =
let lexbuf = Lexing.from_string str in
lexbuf.Lexing.lex_curr_p <-
{ lexbuf.Lexing.lex_curr_p with Lexing.pos_fname = filename };
parse_fun OpamLexer.token lexbuf
let parse_from_channel parse_fun ic filename =
let lexbuf = Lexing.from_channel ic in
lexbuf.Lexing.lex_curr_p <-
{ lexbuf.Lexing.lex_curr_p with Lexing.pos_fname = filename };
parse_fun OpamLexer.token lexbuf
let parse_from_file parse_fun filename =
let ic = open_in_bin filename in
try
let r = parse_from_channel parse_fun ic filename in
close_in ic;
r
with e -> close_in ic; raise e
(** file parsers *)
let main' main filename lexer lexbuf = main lexer lexbuf filename
let string main str filename = parse_from_string (main' main filename) str filename
let channel main ic filename = parse_from_channel (main' main filename) ic filename
let file main filename = parse_from_file (main' main filename) filename
module FullPos = struct
open OpamParserTypes.FullPos
(** raw parser entry points *)
let main = OpamBaseParser.main
let value = OpamBaseParser.value
(** file parsers *)
let string = string main
let channel = channel main
let file = file main
(** value parsers *)
let value_from_string = parse_from_string value
let value_from_channel = parse_from_channel value
let value_from_file = parse_from_file value
(* Functions to transform simple pos to full pos *)
module S = OpamParserTypes
let to_pos e = (e.pos.filename, fst e.pos.start, snd e.pos.start)
let rec to_value v =
match v.pelem with
| Bool b -> S.Bool (to_pos v, b)
| Int i -> S.Int (to_pos v, i)
| String s -> S.String (to_pos v, s)
| Relop (r,v,v') -> S.Relop (to_pos r, r.pelem, to_value v, to_value v')
| Prefix_relop (r,v) -> S.Prefix_relop (to_pos r, r.pelem, to_value v)
| Logop (l,v,v') -> S.Logop (to_pos l, l.pelem, to_value v, to_value v')
| Pfxop (p,v) -> S.Pfxop (to_pos p, p.pelem, to_value v)
| Ident s -> S.Ident (to_pos v, s)
| List l -> S.List (to_pos l, List.map to_value l.pelem)
| Group g -> S.Group (to_pos g, List.map to_value g.pelem)
| Option (v,vl) -> S.Option (to_pos vl, to_value v, List.map to_value vl.pelem)
| Env_binding (v,o,v') -> S.Env_binding (to_pos o, to_value v, o.pelem, to_value v')
let rec to_section s =
{ S.section_kind = s.section_kind.pelem;
S.section_name =
(match s.section_name with
| Some n -> Some n.pelem
| None -> None);
S.section_items = List.map to_item s.section_items.pelem
}
and to_item i =
match i.pelem with
| Section s -> S.Section (to_pos s.section_kind, to_section s)
| Variable (s, v) -> S.Variable (to_pos s, s.pelem, to_value v)
let to_opamfile o =
{ S.file_contents = List.map to_item o.file_contents;
S.file_name = o.file_name
}
end
(** raw parser entry points *)
let main f l fd = FullPos.to_opamfile (OpamBaseParser.main f l fd)
let value f l = FullPos.to_value (OpamBaseParser.value f l)
(** file parsers *)
let string = string main
let channel = channel main
let file = file main
(** value parsers *)
let value_from_string = parse_from_string value
let value_from_channel = parse_from_channel value
let value_from_file = parse_from_file value