aboutsummaryrefslogtreecommitdiff
path: root/lib/checks/default.ml
blob: 0ec1084963b278a156cee4b089e7ec96db3e428d (plain)
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
(** Default implementation which does nothing.

    This module is expected to be used when you only need to implement an
    analyze over a limited part of the whole syntax. *)

open StdLabels
module S = Qsp_syntax.S
module T = Qsp_syntax.T
module Report = Qsp_syntax.Report

module Expression (T' : sig
  type t

  val default : t
end) =
struct
  (** Describe a variable, using the name in capitalized text, and an optionnal
      index.

      If missing, the index should be considered as [0]. *)

  type t' = T'.t

  let ident :
      ctx:Qsp_syntax.S.extract_context -> (S.pos, T'.t) S.variable -> T'.t =
   fun ~ctx _ ->
    ignore ctx;
    T'.default

  (*
        Basic values, text, number…
   *)

  let integer : ctx:Qsp_syntax.S.extract_context -> S.pos -> string -> T'.t =
   fun ~ctx _ _ ->
    ignore ctx;
    T'.default

  let literal :
      ctx:Qsp_syntax.S.extract_context -> S.pos -> T'.t T.literal list -> T'.t =
   fun ~ctx _ _ ->
    ignore ctx;
    T'.default

  (** Call a function. The functions list is hardcoded in lib/lexer.mll *)
  let function_ :
      ctx:Qsp_syntax.S.extract_context ->
      S.pos ->
      T.function_ ->
      T'.t list ->
      T'.t =
   fun ~ctx _ _ _ ->
    ignore ctx;
    T'.default

  (** Unary operator like [-123] or [+'Text']*)
  let uoperator :
      ctx:Qsp_syntax.S.extract_context -> S.pos -> T.uoperator -> T'.t -> T'.t =
   fun ~ctx _ _ _ ->
    ignore ctx;
    T'.default

  (** Binary operator, for a comparaison, or an operation *)
  let boperator :
      ctx:Qsp_syntax.S.extract_context ->
      S.pos ->
      T.boperator ->
      T'.t ->
      T'.t ->
      T'.t =
   fun ~ctx _ _ _ _ ->
    ignore ctx;
    T'.default
end

module Instruction (Expression : sig
  type t'
end) (T : sig
  type t

  val default : t
  val fold : t Seq.t -> t
end) =
struct
  let call : S.pos -> Qsp_syntax.T.keywords -> Expression.t' list -> T.t =
   fun _ _ _ -> T.default

  let location : S.pos -> string -> T.t =
   fun position name ->
    ignore position;
    ignore name;
    T.default

  let comment : S.pos -> T.t =
   fun position ->
    ignore position;
    T.default

  let expression : Expression.t' -> T.t =
   fun expr ->
    ignore expr;
    T.default

  let map_clause : (Expression.t', T.t) S.clause -> T.t Seq.t =
   fun (_, _, els) -> List.to_seq els

  let if_ :
      S.pos ->
      (Expression.t', T.t) S.clause ->
      elifs:(Expression.t', T.t) S.clause list ->
      else_:(S.pos * T.t list) option ->
      T.t =
   fun pos clause ~elifs ~else_ ->
    ignore pos;

    let seq = List.to_seq (clause :: elifs) |> Seq.flat_map map_clause in

    let seq =
      match else_ with
      | None -> seq
      | Some (_, ts) -> Seq.append seq (List.to_seq ts)
    in
    T.fold seq

  let act : S.pos -> label:Expression.t' -> T.t list -> T.t =
   fun pos ~label instructions ->
    ignore pos;
    ignore label;
    T.fold (List.to_seq instructions)

  let assign :
      S.pos ->
      (S.pos, Expression.t') S.variable ->
      Qsp_syntax.T.assignation_operator ->
      Expression.t' ->
      T.t =
   fun _ _ _ _ -> T.default
end