move gramar preprocessing here.
This commit is contained in:
parent
b1a6f092fd
commit
5bae8321d7
78
pl/arith.yap
78
pl/arith.yap
@ -28,7 +28,6 @@
|
|||||||
expand_expr/5,
|
expand_expr/5,
|
||||||
expand_expr/6] ).
|
expand_expr/6] ).
|
||||||
|
|
||||||
|
|
||||||
:- use_system_module( '$_errors', ['$do_error'/2]).
|
:- use_system_module( '$_errors', ['$do_error'/2]).
|
||||||
|
|
||||||
:- use_system_module( '$_modules', ['$clean_cuts'/2]).
|
:- use_system_module( '$_modules', ['$clean_cuts'/2]).
|
||||||
@ -60,8 +59,7 @@
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/** @pred expand_exprs(- _O_,+ _N_)
|
||||||
@pred expand_exprs(- _O_,+ _N_)
|
|
||||||
Control term expansion during compilation.
|
Control term expansion during compilation.
|
||||||
|
|
||||||
Enables low-level optimizations. It reports the current state by
|
Enables low-level optimizations. It reports the current state by
|
||||||
@ -86,6 +84,7 @@ expand_exprs(Old,New) :-
|
|||||||
After a call to this predicate, arithmetical expressions will be compiled.
|
After a call to this predicate, arithmetical expressions will be compiled.
|
||||||
(see example below). This is the default behavior.
|
(see example below). This is the default behavior.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
compile_expressions :- set_value('$c_arith',true).
|
compile_expressions :- set_value('$c_arith',true).
|
||||||
|
|
||||||
/** @pred do_not_compile_expressions
|
/** @pred do_not_compile_expressions
|
||||||
@ -198,6 +197,31 @@ do_c_built_in(Comp0, _, R) :- % now, do it for comparisons
|
|||||||
expand_expr(F, Q, V),
|
expand_expr(F, Q, V),
|
||||||
'$do_and'(P, Q, R0),
|
'$do_and'(P, Q, R0),
|
||||||
'$do_and'(R0, Comp, R).
|
'$do_and'(R0, Comp, R).
|
||||||
|
do_c_built_in(phrase(NT,Xs), NTXsNil) :-
|
||||||
|
'$_arith':do_c_built_in(phrase(NT,Xs,[]), NTXsNil).
|
||||||
|
|
||||||
|
do_c_built_in(phrase(NT,Xs0,Xs), Mod, NewGoal) :-
|
||||||
|
'$goal_expansion_allowed'(phrase(NT,Xs0,Xs), Mod),
|
||||||
|
Goal = phrase(NT,Xs0,Xs),
|
||||||
|
callable(NT),
|
||||||
|
catch('$translate_rule'((pseudo_nt --> NT), Rule),
|
||||||
|
error(Pat,ImplDep),
|
||||||
|
( \+ '$harmless_dcgexception'(Pat),
|
||||||
|
throw(error(Pat,ImplDep))
|
||||||
|
)),
|
||||||
|
Rule = (pseudo_nt(Xs0c,Xsc) :- NewGoal0),
|
||||||
|
Goal \== NewGoal0,
|
||||||
|
% apply translation only if we are safe
|
||||||
|
\+ '$contains_illegal_dcgnt'(NT), !,
|
||||||
|
( var(Xsc), Xsc \== Xs0c
|
||||||
|
-> Xs = Xsc, NewGoal1 = NewGoal0
|
||||||
|
; NewGoal1 = (NewGoal0, Xsc = Xs)
|
||||||
|
),
|
||||||
|
( var(Xs0c)
|
||||||
|
-> Xs0 = Xs0c,
|
||||||
|
NewGoal = NewGoal1
|
||||||
|
; ( Xs0 = Xs0c, NewGoal1 ) = NewGoal
|
||||||
|
).
|
||||||
do_c_built_in(P, _, P).
|
do_c_built_in(P, _, P).
|
||||||
|
|
||||||
do_c_built_metacall(G1, Mod, '$execute_wo_mod'(G1,Mod)) :-
|
do_c_built_metacall(G1, Mod, '$execute_wo_mod'(G1,Mod)) :-
|
||||||
@ -369,6 +393,54 @@ expand_expr(Op, X, Y, O, Q, P) :-
|
|||||||
'$preprocess_args_for_non_commutative'(X, Y, Z, W, E) :-
|
'$preprocess_args_for_non_commutative'(X, Y, Z, W, E) :-
|
||||||
'$do_and'(Z = X, Y = W, E).
|
'$do_and'(Z = X, Y = W, E).
|
||||||
|
|
||||||
|
|
||||||
|
do_c_built_in(phrase(NT,Xs), NTXsNil) :-
|
||||||
|
'$_arith':do_c_built_in(phrase(NT,Xs,[]), NTXsNil).
|
||||||
|
|
||||||
|
do_c_built_in(phrase(NT,Xs0,Xs), Mod, NewGoal) :-
|
||||||
|
'$goal_expansion_allowed'(phrase(NT,Xs0,Xs), Mod),
|
||||||
|
Goal = phrase(NT,Xs0,Xs),
|
||||||
|
callable(NT),
|
||||||
|
catch('$translate_rule'((pseudo_nt --> NT), Rule),
|
||||||
|
error(Pat,ImplDep),
|
||||||
|
( \+ '$harmless_dcgexception'(Pat),
|
||||||
|
throw(error(Pat,ImplDep))
|
||||||
|
)),
|
||||||
|
Rule = (pseudo_nt(Xs0c,Xsc) :- NewGoal0),
|
||||||
|
Goal \== NewGoal0,
|
||||||
|
% apply translation only if we are safe
|
||||||
|
\+ '$contains_illegal_dcgnt'(NT), !,
|
||||||
|
( var(Xsc), Xsc \== Xs0c
|
||||||
|
-> Xs = Xsc, NewGoal1 = NewGoal0
|
||||||
|
; NewGoal1 = (NewGoal0, Xsc = Xs)
|
||||||
|
),
|
||||||
|
( var(Xs0c)
|
||||||
|
-> Xs0 = Xs0c,
|
||||||
|
NewGoal = NewGoal1
|
||||||
|
; ( Xs0 = Xs0c, NewGoal1 ) = NewGoal
|
||||||
|
).
|
||||||
|
|
||||||
|
'$goal_expansion_allowed'(phrase(_NT,_Xs0,_Xs), _Mod).
|
||||||
|
|
||||||
|
%% contains_illegal_dcgnt(+Term) is semidet.
|
||||||
|
%
|
||||||
|
% True if Term contains a non-terminal we cannot deal with using
|
||||||
|
% goal-expansion. The test is too general approximation, but safe.
|
||||||
|
|
||||||
|
'$contains_illegal_dcgnt'(NT) :-
|
||||||
|
functor(NT, _, A),
|
||||||
|
between(1, A, I),
|
||||||
|
arg(I, NT),
|
||||||
|
nonvar(I),
|
||||||
|
( I = ! ; I = phrase(_,_,_) ), !.
|
||||||
|
% write(contains_illegal_nt(NT)), % JW: we do not want to write
|
||||||
|
% nl.
|
||||||
|
|
||||||
|
'$harmless_dcgexception'(instantiation_error). % ex: phrase(([1],x:X,[3]),L)
|
||||||
|
'$harmless_dcgexception'(type_error(callable,_)). % ex: phrase(27,L)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@}
|
@}
|
||||||
|
Reference in New Issue
Block a user