Merge branch 'master' of ssh://yap.git.sourceforge.net/gitroot/yap/yap-6.3
This commit is contained in:
commit
417df2e85a
81
C/parser.c
81
C/parser.c
@ -440,54 +440,55 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS)
|
|||||||
case Name_tok:
|
case Name_tok:
|
||||||
t = Yap_tokptr->TokInfo;
|
t = Yap_tokptr->TokInfo;
|
||||||
NextToken;
|
NextToken;
|
||||||
|
/* special rules apply for +1, -2.3, etc... */
|
||||||
|
if (Yap_tokptr->Tok == Number_tok) {
|
||||||
|
if ((Atom)t == AtomMinus) {
|
||||||
|
t = Yap_tokptr->TokInfo;
|
||||||
|
if (IsIntTerm(t))
|
||||||
|
t = MkIntTerm(-IntOfTerm(t));
|
||||||
|
else if (IsFloatTerm(t))
|
||||||
|
t = MkFloatTerm(-FloatOfTerm(t));
|
||||||
|
#ifdef USE_GMP
|
||||||
|
else if (IsBigIntTerm(t)) {
|
||||||
|
t = Yap_gmp_neg_big(t);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
t = MkLongIntTerm(-LongIntOfTerm(t));
|
||||||
|
NextToken;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if ((Yap_tokptr->Tok != Ord(Ponctuation_tok)
|
if ((Yap_tokptr->Tok != Ord(Ponctuation_tok)
|
||||||
|| Unsigned(Yap_tokptr->TokInfo) != 'l')
|
|| Unsigned(Yap_tokptr->TokInfo) != 'l')
|
||||||
&& IsPrefixOp((Atom)t, &opprio, &oprprio PASS_REGS)
|
&& IsPrefixOp((Atom)t, &opprio, &oprprio PASS_REGS)
|
||||||
) {
|
) {
|
||||||
/* special rules apply for +1, -2.3, etc... */
|
if (Yap_tokptr->Tok == Name_tok) {
|
||||||
if (Yap_tokptr->Tok == Number_tok) {
|
Atom at = (Atom)Yap_tokptr->TokInfo;
|
||||||
if ((Atom)t == AtomMinus) {
|
|
||||||
t = Yap_tokptr->TokInfo;
|
|
||||||
if (IsIntTerm(t))
|
|
||||||
t = MkIntTerm(-IntOfTerm(t));
|
|
||||||
else if (IsFloatTerm(t))
|
|
||||||
t = MkFloatTerm(-FloatOfTerm(t));
|
|
||||||
#ifdef USE_GMP
|
|
||||||
else if (IsBigIntTerm(t)) {
|
|
||||||
t = Yap_gmp_neg_big(t);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
else
|
|
||||||
t = MkLongIntTerm(-LongIntOfTerm(t));
|
|
||||||
NextToken;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (Yap_tokptr->Tok == Name_tok) {
|
|
||||||
Atom at = (Atom)Yap_tokptr->TokInfo;
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
if ((Atom)t == AtomPlus) {
|
if ((Atom)t == AtomPlus) {
|
||||||
if (at == AtomInf) {
|
if (at == AtomInf) {
|
||||||
t = MkFloatTerm(INFINITY);
|
t = MkFloatTerm(INFINITY);
|
||||||
NextToken;
|
NextToken;
|
||||||
break;
|
|
||||||
} else if (at == AtomNan) {
|
|
||||||
t = MkFloatTerm(NAN);
|
|
||||||
NextToken;
|
|
||||||
break;
|
break;
|
||||||
|
} else if (at == AtomNan) {
|
||||||
|
t = MkFloatTerm(NAN);
|
||||||
|
NextToken;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if ((Atom)t == AtomMinus) {
|
||||||
|
if (at == AtomInf) {
|
||||||
|
t = MkFloatTerm(-INFINITY);
|
||||||
|
NextToken;
|
||||||
|
break;
|
||||||
|
} else if (at == AtomNan) {
|
||||||
|
t = MkFloatTerm(NAN);
|
||||||
|
NextToken;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if ((Atom)t == AtomMinus) {
|
|
||||||
if (at == AtomInf) {
|
|
||||||
t = MkFloatTerm(-INFINITY);
|
|
||||||
NextToken;
|
|
||||||
break;
|
|
||||||
} else if (at == AtomNan) {
|
|
||||||
t = MkFloatTerm(NAN);
|
|
||||||
NextToken;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (opprio <= prio) {
|
if (opprio <= prio) {
|
||||||
/* try to parse as a prefix operator */
|
/* try to parse as a prefix operator */
|
||||||
TRY(
|
TRY(
|
||||||
|
@ -37,7 +37,6 @@
|
|||||||
#ifdef TABLING
|
#ifdef TABLING
|
||||||
static Int p_freeze_choice_point( USES_REGS1 );
|
static Int p_freeze_choice_point( USES_REGS1 );
|
||||||
static Int p_wake_choice_point( USES_REGS1 );
|
static Int p_wake_choice_point( USES_REGS1 );
|
||||||
static Int p_reset_frozen_choice_points( USES_REGS1 );
|
|
||||||
static Int p_abolish_frozen_choice_points_until( USES_REGS1 );
|
static Int p_abolish_frozen_choice_points_until( USES_REGS1 );
|
||||||
static Int p_abolish_frozen_choice_points_all( USES_REGS1 );
|
static Int p_abolish_frozen_choice_points_all( USES_REGS1 );
|
||||||
static Int p_table( USES_REGS1 );
|
static Int p_table( USES_REGS1 );
|
||||||
@ -338,6 +337,7 @@ static Int p_abolish_table( USES_REGS1 ) {
|
|||||||
TabEnt_hash_chain(tab_ent) = NULL;
|
TabEnt_hash_chain(tab_ent) = NULL;
|
||||||
free_subgoal_hash_chain(hash);
|
free_subgoal_hash_chain(hash);
|
||||||
sg_node = TrNode_child(TabEnt_subgoal_trie(tab_ent));
|
sg_node = TrNode_child(TabEnt_subgoal_trie(tab_ent));
|
||||||
|
TrNode_child(TabEnt_subgoal_trie(tab_ent)) = NULL;
|
||||||
if (sg_node) {
|
if (sg_node) {
|
||||||
if (TabEnt_arity(tab_ent)) {
|
if (TabEnt_arity(tab_ent)) {
|
||||||
TrNode_child(TabEnt_subgoal_trie(tab_ent)) = NULL;
|
TrNode_child(TabEnt_subgoal_trie(tab_ent)) = NULL;
|
||||||
@ -366,7 +366,8 @@ static Int p_abolish_all_tables( USES_REGS1 ) {
|
|||||||
TabEnt_hash_chain(tab_ent) = NULL;
|
TabEnt_hash_chain(tab_ent) = NULL;
|
||||||
free_subgoal_hash_chain(hash);
|
free_subgoal_hash_chain(hash);
|
||||||
sg_node = TrNode_child(TabEnt_subgoal_trie(tab_ent));
|
sg_node = TrNode_child(TabEnt_subgoal_trie(tab_ent));
|
||||||
if (sg_node) {
|
TrNode_child(TabEnt_subgoal_trie(tab_ent)) = NULL;
|
||||||
|
if (sg_node) {
|
||||||
if (TabEnt_arity(tab_ent)) {
|
if (TabEnt_arity(tab_ent)) {
|
||||||
TrNode_child(TabEnt_subgoal_trie(tab_ent)) = NULL;
|
TrNode_child(TabEnt_subgoal_trie(tab_ent)) = NULL;
|
||||||
free_subgoal_trie(sg_node, TRAVERSE_MODE_NORMAL, TRAVERSE_POSITION_FIRST);
|
free_subgoal_trie(sg_node, TRAVERSE_MODE_NORMAL, TRAVERSE_POSITION_FIRST);
|
||||||
|
Reference in New Issue
Block a user