Blame view

fz/semantic.pl 3.5 KB
0b83a7f1   Salvador Abreu   First stab at sem...
1
2
% == No, Emacs this is -*-Prolog-*- code, not what you thought... =============

57421ab2   Salvador Abreu   first stab at typ...
3
4
5
6
7
8
% == NAMES ====================================================================

% -- sa_names(AST_IN, AST_OUT, ST) --------------------------------------------
%
% sa_names/3: do name analysis (replace identifiers by their dict. entry)

0b83a7f1   Salvador Abreu   First stab at sem...
9
sa_names(fzn(preds(IP), vars(IV), constrs(IC), SOLVE),
57421ab2   Salvador Abreu   first stab at typ...
10
	 fzn(preds(OP), vars(OV), constrs(OC), SOLVE), ST) :-
4029344a   Salvador Abreu   now using free-en...
11
12
13
    sa_n_traverse(IP, OP, ST),  % predicates
    sa_n_traverse(IV, OV, ST),	% variables
    sa_n_traverse(IC, OC, ST).  % constraints
0b83a7f1   Salvador Abreu   First stab at sem...
14
15
16

% -----------------------------------------------------------------------------

f1a115f5   Salvador Abreu   a litte progress ...
17
sa_n_traverse([], [], _ST) :- !.
4029344a   Salvador Abreu   now using free-en...
18
sa_n_traverse([N|Ns], [NN|NNs], ST) :-
f461b0bb   Salvador Abreu   first stab at AST...
19
20
    sa_n(N, NN, ST), !,
    sa_n_traverse(Ns, NNs, ST).
f1a115f5   Salvador Abreu   a litte progress ...
21
sa_n_traverse([_|Ns], NNs, ST) :- !, % ignore failing nodes (beware!)
4029344a   Salvador Abreu   now using free-en...
22
    sa_n_traverse(Ns, NNs, ST).
0b83a7f1   Salvador Abreu   First stab at sem...
23

f1a115f5   Salvador Abreu   a litte progress ...
24
sa_n_traverse(N, NN, ST) :- sa_n(N, NN, ST). % non-list case
0b83a7f1   Salvador Abreu   First stab at sem...
25

57421ab2   Salvador Abreu   first stab at typ...
26

0b83a7f1   Salvador Abreu   First stab at sem...
27
28
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%
4029344a   Salvador Abreu   now using free-en...
29
% sa_n(AST_N_IN, AST_N_OUT, ST)
f1a115f5   Salvador Abreu   a litte progress ...
30
%
57421ab2   Salvador Abreu   first stab at typ...
31
32
33
34
35
% arguments:
%  AST_N_IN         - input AST node
%  AST_N_OUT        - output AST node (same structure, rewritten)
%  ST               - symbol table (gets extended)
%
f1a115f5   Salvador Abreu   a litte progress ...
36
% handle all AST cases:
57421ab2   Salvador Abreu   first stab at typ...
37
%  var(N,T,I,A)     - Name, Type, Initializer, Attrib -- variable declaration
26ed8fd4   Salvador Abreu   arrays
38
%  lit(V,T)         - Value, Type -- literal with type
57421ab2   Salvador Abreu   first stab at typ...
39
40
41
42
%  id(N)            - Name -- identifier
%  constraint(C,A)  - Constraint, Attrib -- constraint
%

2c862ae2   Salvador Abreu   variables with an...
43
44
sa_n(var(N,T,I,A), V, ST) :-
    sa_attribs(A, AX, ST),
0b83a7f1   Salvador Abreu   First stab at sem...
45
    sa_n_traverse(I, NI, ST),	% parse initializer
2c862ae2   Salvador Abreu   variables with an...
46
    V=var(N,T,NI,AX),		% new AST node becomes ST entry value
4029344a   Salvador Abreu   now using free-en...
47
    st_insert(ST, N, V).
2c862ae2   Salvador Abreu   variables with an...
48
49
50


sa_n(lit(E,array(T)), lit(NE, array(T)), ST) :-
26ed8fd4   Salvador Abreu   arrays
51
    sa_n_traverse(E, NE, ST).
1fa8bcd2   Salvador Abreu   back-end specific...
52
sa_n(lit(E,int), lit(E,int), _ST).
26ed8fd4   Salvador Abreu   arrays
53
54
55
sa_n(lit(E,float), lit(E,float), _ST).
sa_n(lit(E,string), lit(E,string), _ST).

0b83a7f1   Salvador Abreu   First stab at sem...
56

57421ab2   Salvador Abreu   first stab at typ...
57
sa_n(id(N), V, ST) :- st_lookup(ST, N, V), !.
f1a115f5   Salvador Abreu   a litte progress ...
58
59
60
61
62
63
sa_n(id(N), V, ST) :- V=var(N,_,_,_), % type as yet unknown
		      st_insert(ST, N, V).


sa_n(constraint(CE, AT), constraint(NCE, AT), ST) :-
    CE=..[C|AS],
57421ab2   Salvador Abreu   first stab at typ...
64
    sa_n_traverse(AS, NAS, ST),
f1a115f5   Salvador Abreu   a litte progress ...
65
    NCE=..[C|NAS].
57421ab2   Salvador Abreu   first stab at typ...
66

f1a115f5   Salvador Abreu   a litte progress ...
67
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0b83a7f1   Salvador Abreu   First stab at sem...
68

57421ab2   Salvador Abreu   first stab at typ...
69
% == TYPES ====================================================================
7d0195a6   Salvador Abreu   replace initializ...
70

57421ab2   Salvador Abreu   first stab at typ...
71
% -- sa_types(AST, ST) --------------------------------------------------------
7d0195a6   Salvador Abreu   replace initializ...
72
%
57421ab2   Salvador Abreu   first stab at typ...
73
74
75
% sa_types/2: do type analysis (traverse AST enforcing type correctness).
% as a side-effect, it will do type inference.

0b83a7f1   Salvador Abreu   First stab at sem...
76
77
sa_types(fzn(_PS, vars(VS), constrs(CS), _S), ST) :-
    sa_t_traverse(VS, ST),
57421ab2   Salvador Abreu   first stab at typ...
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
    sa_t_traverse(CS, ST).

% -----------------------------------------------------------------------------

sa_t_traverse([], _ST) :- !.
sa_t_traverse([N|Ns], ST) :-
    sa_t(N, ST), !,
    sa_t_traverse(Ns, ST).
sa_t_traverse([_|Ns], ST) :- !, % ignore failing nodes (beware!)
    sa_t_traverse(Ns, ST).

sa_t_traverse(N, ST) :- sa_t(N, ST). % non-list case

% -- sa_t(NODE, ST) -----------------------------------------------------------

sa_t(var(_N,T,I,_A), _ST) :- type(I,T).
sa_t(lit(E,T), _ST) :- type(lit(E,T), T).
sa_t(constraint(CE, _AT), ST) :-
    CE=..[_|AS],
    sa_t_traverse(AS, ST).

% =============================================================================

sa_attribs([A|As], [NA|NAs], ST) :-
    sa_attrib(A, NA, ST), !,
26ed8fd4   Salvador Abreu   arrays
103
    sa_attribs(As, NAs, ST).
57421ab2   Salvador Abreu   first stab at typ...
104
105
106
107
108
109
110
sa_attribs([_|As], NAs, ST) :-	% ignore unknown attributes
    sa_attribs(As, NAs, ST).
sa_attribs([], [], _).


sa_attrib(id(output_var), output, _).

f461b0bb   Salvador Abreu   first stab at AST...
111
% -----------------------------------------------------------------------------
0b83a7f1   Salvador Abreu   First stab at sem...

57421ab2   Salvador Abreu   first stab at typ...