File: code_typing_context.ml

package info (click to toggle)
galax 1.1-10
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 12,832 kB
  • sloc: ml: 96,603; xml: 26,602; ansic: 4,875; sh: 3,977; makefile: 1,667; java: 1,146
file content (57 lines) | stat: -rwxr-xr-x 2,742 bytes parent folder | download | duplicates (5)
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
(***********************************************************************)
(*                                                                     *)
(*                                 GALAX                               *)
(*                              XQuery Engine                          *)
(*                                                                     *)
(*  Copyright 2001-2007.                                               *)
(*  Distributed only by permission.                                    *)
(*                                                                     *)
(***********************************************************************)

(* $Id: code_typing_context.ml,v 1.6 2007/02/01 22:08:45 simeon Exp $ *)


open Error
open Xquery_common_ast
type code_type_context =
    { code_type_context_variables : (cvname * Xquery_physical_type_ast.physical_xml_type) list;
      code_type_context_input     : Xquery_physical_type_ast.physical_tuple_type option }

let default_code_type_context =
  {
   (* The builtin fs: variables always exist and have the type DOM *)
    code_type_context_variables = [(Xquery_common_ast.fs_dot, Xquery_physical_type_ast_util.dom_list_type);
				    (Xquery_common_ast.fs_sequence, Xquery_physical_type_ast_util.dom_list_type);
				    (Xquery_common_ast.fs_last, Xquery_physical_type_ast_util.dom_list_type);
				    (Xquery_common_ast.fs_position, Xquery_physical_type_ast_util.dom_list_type);];
    (* The implicit INPUT tuple always exists and has the type empty table *)
    code_type_context_input     = Some [] }

let add_variable_type code_type_context cvname physical_xml_type =
  { code_type_context_variables = (cvname,physical_xml_type) :: code_type_context.code_type_context_variables;
    code_type_context_input     = code_type_context.code_type_context_input }

let get_variable_type code_type_context cvname =
  try
    let (x, t) = 
      List.find (fun (x,t) -> Namespace_names.rqname_equal x cvname) code_type_context.code_type_context_variables
    in t
  with
  | Not_found ->
      raise (Query (Internal_Error ("Unknown type for variable "^(Namespace_names.prefixed_string_of_rqname cvname)^" during physical type inference")))


(**********************************)
(* Input of dependant expressions *)
(**********************************)

let add_input_type code_type_context physical_tuple_type =
  { code_type_context_variables = code_type_context.code_type_context_variables;
    code_type_context_input     = Some physical_tuple_type }
  
let get_input_type code_type_context =
  match code_type_context.code_type_context_input with
  | None ->
      raise (Query (Internal_Error "Unknown INPUT type during physical type inference"))
  | Some t -> t