-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSymbol.mli
119 lines (88 loc) · 4.48 KB
/
Symbol.mli
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
(* Symbol table *)
exception Exit
type pass_mode = PASS_BY_VALUE | PASS_BY_REFERENCE
type param_status =
| PARDEF_COMPLETE (* Πλήρης ορισμός *)
| PARDEF_DEFINE (* Εν μέσω ορισμού *)
| PARDEF_CHECK (* Εν μέσω ελέγχου *)
type scope = {
sco_parent : scope option;
sco_nesting : int;
mutable sco_entries : entry list;
mutable sco_negofs : int
}
and variable_info = { (******* Μεταβλητή *******)
variable_type : Types.typ; (* Τύπος *)
variable_offset : int (* Offset στο Ε.Δ. *)
}
and function_info = { (******* Συνάρτηση *******)
mutable function_isForward : bool; (* forward Functio *)
mutable function_paramlist : entry list; (* List Parameters *)
mutable function_redeflist : entry list; (* Λίστα παραμέτρων (2η) *)
mutable function_result : Types.typ; (* Function result *)
mutable function_pstatus : param_status; (* Κατάσταση παραμέτρων *)
mutable function_initquad : int; (* Αρχική τετράδα *)
mutable function_uniq_id : int option
}
and parameter_info = { (****** Παράμετρος *******)
parameter_type : Types.typ; (* Τύπος *)
mutable parameter_offset : int; (* Offset στο Ε.Δ. *)
parameter_mode : pass_mode (* Τρόπος περάσματος *)
}
and temporary_info = { (** Προσωρινή μεταβλητή **)
temporary_type : Types.typ; (* Τύπος *)
temporary_offset : int (* Offset στο Ε.Δ. *)
}
and entry_info = ENTRY_none
| ENTRY_variable of variable_info
| ENTRY_function of function_info
| ENTRY_parameter of parameter_info
| ENTRY_label of bool ref (* inside for-loop or not*)
| ENTRY_temporary of temporary_info
and entry = {
entry_id : Identifier.id;
entry_scope : scope;
entry_info : entry_info
}
type lookup_type = LOOKUP_CURRENT_SCOPE | LOOKUP_ALL_SCOPES
(** returns true if entry is local to the current scope. *)
val is_local : entry -> bool
val string_of_entry : entry -> string
val uniq_string_of_fentry : entry -> string
val no_entry : Identifier.id -> entry
val currentScope : scope ref (* Τρέχουσα εμβέλεια *)
val quadNext : int ref (* Αριθμός επόμενης τετράδας *)
val tempNumber : int ref (* Αρίθμηση των temporaries *)
val initSymbolTable : int -> unit
val openScope : unit -> unit
val closeScope : unit -> unit
val newVariable : Identifier.id -> Types.typ -> bool -> entry
val newLabel : Identifier.id -> bool -> entry
val newFunction : Identifier.id -> bool -> entry
val newParameter : Identifier.id -> Types.typ -> pass_mode ->
entry -> bool -> entry
val newTemporary : Types.typ -> entry
val uniq_id_of_fun : entry -> int
val endLabelScope : entry -> unit
val forwardFunction : entry -> unit
val endFunctionHeader : entry -> Types.typ -> unit
val lookupEntry : Identifier.id -> lookup_type -> bool -> entry
(* NOTE: Result type of `int a[N];` is transformed to `int *` *)
val lookup_result_type : Identifier.id -> Types.typ
val is_procedure : entry -> bool
val lookup_bp_offset : entry -> int
val lookup_passmode : entry -> pass_mode
(* NOTE: The following functions take as input an identifier of a function. *)
val lookup_pass_styles : Identifier.id -> pass_mode list
val lookup_pass_types : Identifier.id -> Types.typ list
(* return true if a function has been defined *)
val lookup_fr_size : unit -> int
val fun_is_defined : Identifier.id -> bool
val fun_is_globally_defined : Identifier.id -> bool
val set_fun_globally_defined : Identifier.id -> unit
val is_mutable: Identifier.id -> bool
val start_positive_offset : int (* Αρχικό θετικό offset στο Ε.Δ. *)
val start_negative_offset : int (* Αρχικό αρνητικό offset στο Ε.Δ. *)
val size_of_entry : entry -> int
val size_of_entry_deref : entry -> int
val size_of_params : entry list -> int