13
14:- module(preparser, [parse/1, parse/2]). 15
16:- ensure_loaded(parse_util). 17:- use_module(directive_handler). 18
24parse(File):-
25 open(File,read,InStream),
26 parse(File,InStream),
27 close(InStream).
28
34parse(File,InStream):-
35 new_node_id_pdt(Id),
36 nb_setval(module_to_parse, user),
37 parse_clauses(InStream,Id),
38 nb_getval(module_to_parse,ActualModule),
39 assert(fileT(Id,File,ActualModule)),
40 assert(fileT_ri(File,Id)).
41
47parse_clauses(InStream,FileId):-
48 repeat,
49 catch(
50 read_term(InStream,Clause,
51 [ 52 subterm_positions(SubPos), 55 variable_names(VarNames) 56 ]),
57 error(Error,Context),
58 ( assert(error(Error,Context,FileId)), 59 fail 60 )
61 ),
62 ( Clause==end_of_file
63 -> true
64 ; nb_getval(module_to_parse,Module),
65 numbervars(VarNames,0,_),
66 parse_clause_elements(Clause,SubPos,FileId,VarNames,Module),
67 68 fail
69 ),
70 !.
75
90parse_clause_elements((:- Body), Pos, FileId, VarNames, UnchangedModule) :- 91 !,
92 Pos = term_position(From, To, _FFrom, _FTo, [SubPos]),
93 assert_new_node( :- Body,From,To,DirectiveId),
94 Body =..[Functor|Args],
95 handle_directive(Functor,Args,SubPos,DirectiveId,FileId,UnchangedModule),
96 nb_getval(module_to_parse,Module),
97 assert(directiveT(DirectiveId,FileId,Module)),
98 Body =.. [Functor|Args],
99 assert(pos_and_vars(DirectiveId,SubPos,VarNames)).
100
101parse_clause_elements((Head :- Body), Pos, FileId, VarNames, Module) :- 102 !,
103 Pos = term_position(From, To, _FFrom, _FTo, SubPos),
104 SubPos = [HeadPos, BodyPos],
105 assert_new_node(Head :- Body,From,To,ClauseId),
106 functor(Head,Functor,Arity),
107 assert(clauseT(ClauseId,FileId,Module,Functor,Arity)),
108 assert(pos_and_vars(ClauseId,BodyPos,VarNames)),
109 parse_head_literal(Head, HeadPos, ClauseId, Module, VarNames).
110
111parse_clause_elements(Head, Pos, FileId, VarNames, Module) :- 112 !,
113 ( Pos = term_position(From, To, _FFrom, _FTo, _SubPos)
114 ; Pos = From - To
115 ),
116 assert_new_node(Head,From,To,ClauseId),
117 functor(Head,Functor,Arity),
118 assert(clauseT(ClauseId,FileId,Module,Functor,Arity)),
119 parse_head_literal(Head, Pos, ClauseId, Module, VarNames).
120
121
122
123
124parse_head_literal(Module:Head, Pos, ClauseId, _OrigModule, _VarNames) :-
125 !,
126 Pos = term_position(From, To, _FFrom, _FTo, _SubPos),
127 128 assert_new_node(Module:Head,From,To,Id), 129 functor(Head,Functor,Arity),
130 assert(headT(Id,ClauseId,Module,Functor,Arity)).
131
135
136parse_head_literal(Head, Pos, ClauseId, Module, _VarNames) :-
137 ( Pos = term_position(From, To, _FFrom, _FTo, _SubPos)
138 ; Pos = From - To
139 ),
140 assert_new_node(Head,From,To,Id), 141 functor(Head,Functor,Arity),
142 assert(headT(Id,ClauseId,Module,Functor,Arity))