; call(M:GRBody1, S0, S)
).
-
-module_call_qualified(M, Call, Call1) :-
- ( nonvar(M) -> Call1 = M:Call
- ; Call = Call1
- ).
-
-
% The same version of the below two dcg_rule clauses, but with module scoping.
dcg_rule(( M:NonTerminal, Terminals --> GRBody ), ( M:Head :- Body )) :-
dcg_non_terminal(NonTerminal, S0, S, Head),
NonTerminal \= ( \+ _ ),
loader:strip_module(NonTerminal, M, NonTerminal0),
dcg_non_terminal(NonTerminal0, S0, S, Goal0),
- module_call_qualified(M, Goal0, Goal1).
+ ( functor(NonTerminal, (:), 2) ->
+ Goal1 = M:Goal0
+ ; Goal1 = Goal0
+ ).
% The following constructs in a grammar rule body
% are defined in the corresponding subclauses.
[Module],
copy_attribute_modules(Attrs).
+attribute_goals_or_fail(M, V, V0, V1) :-
+ ( catch(M:attribute_goals(V, V0, V1),
+ E,
+ '$project_atts':'$print_attribute_goals_exception'(M, E)
+ ) ->
+ true
+ ; V0 = V1
+ ).
+
gather_residual_goals([]) --> [].
gather_residual_goals([V|Vs]) -->
{ '$get_attr_list'(V, Attrs),
phrase(copy_attribute_modules(Attrs), Modules0),
sort(Modules0, Modules) },
- foldl(V+\M^phrase(M:attribute_goals(V)), Modules),
+ foldl(V+\M^attribute_goals_or_fail(M, V), Modules),
gather_residual_goals(Vs).
delete_all_attributes_from_var(V) :- '$delete_all_attributes_from_var'(V).
findall(Term-Rs, term_residual_goals(Term,Rs), [Copy-Gs]).
term_residual_goals(Term,Rs) :-
- '$term_attributed_variables'(Term, Vs),
- phrase(gather_residual_goals(Vs), Rs),
- maplist(delete_all_attributes_from_var, Vs).
+ '$term_attributed_variables'(Term, Vs),
+ phrase(gather_residual_goals(Vs), Rs),
+ maplist(delete_all_attributes_from_var, Vs).