(************************************************************************) (* * The Rocq Prover / The Rocq Development Team *) (* v * Copyright INRIA, CNRS and contributors *) (* <O___,, * (see version control and CREDITS file for authors & dates) *) (* \VV/ **************************************************************) (* // * This file is distributed under the terms of the *) (* * GNU Lesser General Public License Version 2.1 *) (* * (see LICENSE file for the text of the license) *) (************************************************************************)
(** Ltac debugger interface; clients should register hooks to interact
with their provided interface. *)
module Action = struct type t =
| StepIn
| StepOver
| StepOut
| Continue
| Skip
| Interrupt
| Help
| UpdBpts of ((string * int) * bool) list
| Configd
| GetStack
| GetVars of int
| RunCnt of int
| RunBreakpoint ofstring
| Command ofstring
| Failed
| Ignore (* do nothing, read another command *)
(* XXX: Could we move this to the CString utility library? *) let possibly_unquote s = ifString.length s >= 2 && s.[0] == '"' && s.[String.length s - 1] == '"'then String.sub s 1 (String.length s - 2) else
s
let parse_complex inst : (t, string) result = if'r' = String.get inst 0 then let arg = String.(trim (sub inst 1 (length inst - 1))) in if arg <> ""then match int_of_string_opt arg with
| Some num -> if num < 0 then
Error "number must be positive" else
Ok (RunCnt num)
| None ->
Ok (RunBreakpoint (possibly_unquote arg)) else
Error ("invalid input: " ^ inst) else
Error ("invalid input: " ^ inst)
(* XXX: Should be moved to the clients *) let parse inst : (t, string) result = match inst with
| "" -> Ok StepIn
| "s" -> Ok Skip
| "x" -> Ok Interrupt
| "h"| "?" -> Ok Help
| _ -> parse_complex inst end
module Answer = struct type t =
| Prompt of Pp.t
| Goal of Pp.t
| Output of Pp.t
| Init
| Stack of (string * (string * int list) option) list
| Vars of (string * Pp.t) list end
module Intf = struct
type t =
{ read_cmd : unit -> Action.t (** request a debugger command from the client *)
; submit_answer : Answer.t -> unit (** receive a debugger answer from Ltac *)
; isTerminal : bool (** whether the debugger is running as a terminal (non-visual) *)
}
let ltac_debug_ref : t optionref = ref None letset hooks = ltac_debug_ref := Some hooks let get () = !ltac_debug_ref
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.