make syntax extensions SWI compatible

This commit is contained in:
Vitor Santos Costa 2013-09-13 11:44:26 +01:00
parent e1208fc7ad
commit 2cfa0081ad
6 changed files with 48 additions and 28 deletions

View File

@ -69,8 +69,8 @@ typedef struct jmp_buff_struct {
} JMPBUFF; } JMPBUFF;
static void GNextToken( CACHE_TYPE1 ); static void GNextToken( CACHE_TYPE1 );
static void checkfor(Term, JMPBUFF * CACHE_TYPE); static void checkfor(wchar_t, JMPBUFF * CACHE_TYPE);
static Term ParseArgs(Atom, Term, JMPBUFF *, Term CACHE_TYPE); static Term ParseArgs(Atom, wchar_t, JMPBUFF *, Term CACHE_TYPE);
static Term ParseList(JMPBUFF * CACHE_TYPE); static Term ParseList(JMPBUFF * CACHE_TYPE);
static Term ParseTerm(int, JMPBUFF * CACHE_TYPE); static Term ParseTerm(int, JMPBUFF * CACHE_TYPE);
@ -315,16 +315,16 @@ GNextToken( USES_REGS1 )
} }
inline static void inline static void
checkfor(Term c, JMPBUFF *FailBuff USES_REGS) checkfor(wchar_t c, JMPBUFF *FailBuff USES_REGS)
{ {
if (LOCAL_tokptr->Tok != Ord(Ponctuation_tok) if (LOCAL_tokptr->Tok != Ord(Ponctuation_tok)
|| LOCAL_tokptr->TokInfo != c) || LOCAL_tokptr->TokInfo != (Term)c)
FAIL; FAIL;
NextToken; NextToken;
} }
static Term static Term
ParseArgs(Atom a, Term close, JMPBUFF *FailBuff, Term arg1 USES_REGS) ParseArgs(Atom a, wchar_t close, JMPBUFF *FailBuff, Term arg1 USES_REGS)
{ {
int nargs = 0; int nargs = 0;
Term *p, t; Term *p, t;
@ -405,6 +405,18 @@ ParseArgs(Atom a, Term close, JMPBUFF *FailBuff, Term arg1 USES_REGS)
return t; return t;
} }
static Term MakeAccessor( Term t, Functor f )
{
UInt arity = ArityOfFunctor(FunctorOfTerm(t)), i;
Term tf[2], tl= TermNil;
tf[1] = ArgOfTerm(1, t);
for (i = arity; i > 1; i--) {
tl = MkPairTerm(ArgOfTerm(i, t), tl);
}
tf[0] = tl;
return Yap_MkApplTerm( f, 2, tf );
}
static Term static Term
ParseList(JMPBUFF *FailBuff USES_REGS) ParseList(JMPBUFF *FailBuff USES_REGS)
@ -540,7 +552,7 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS)
} }
if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok) if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)
&& Unsigned(LOCAL_tokptr->TokInfo) == 'l') && Unsigned(LOCAL_tokptr->TokInfo) == 'l')
t = ParseArgs((Atom) t, (Term)')', FailBuff, 0L PASS_REGS); t = ParseArgs((Atom) t, ')', FailBuff, 0L PASS_REGS);
else else
t = MkAtomTerm((Atom)t); t = MkAtomTerm((Atom)t);
break; break;
@ -606,7 +618,7 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS)
case 'l': /* non solo ( */ case 'l': /* non solo ( */
NextToken; NextToken;
t = ParseTerm(1200, FailBuff PASS_REGS); t = ParseTerm(1200, FailBuff PASS_REGS);
checkfor((Term) ')', FailBuff PASS_REGS); checkfor(')', FailBuff PASS_REGS);
break; break;
case '[': case '[':
NextToken; NextToken;
@ -617,7 +629,7 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS)
break; break;
} }
t = ParseList(FailBuff PASS_REGS); t = ParseList(FailBuff PASS_REGS);
checkfor((Term) ']', FailBuff PASS_REGS); checkfor(']', FailBuff PASS_REGS);
break; break;
case '{': case '{':
NextToken; NextToken;
@ -634,7 +646,7 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS)
LOCAL_ErrorMessage = "Stack Overflow"; LOCAL_ErrorMessage = "Stack Overflow";
FAIL; FAIL;
} }
checkfor((Term) '}', FailBuff PASS_REGS); checkfor('}', FailBuff PASS_REGS);
break; break;
default: default:
FAIL; FAIL;
@ -734,19 +746,21 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS)
} else if (Unsigned(LOCAL_tokptr->TokInfo) == '(' && } else if (Unsigned(LOCAL_tokptr->TokInfo) == '(' &&
IsPosfixOp(AtomEmptyBrackets, &opprio, &oplprio PASS_REGS) IsPosfixOp(AtomEmptyBrackets, &opprio, &oplprio PASS_REGS)
&& opprio <= prio && oplprio >= curprio) { && opprio <= prio && oplprio >= curprio) {
t = ParseArgs(AtomEmptyBrackets, (Term)')', FailBuff, t PASS_REGS); t = ParseArgs(AtomEmptyBrackets, ')', FailBuff, t PASS_REGS);
curprio = opprio; curprio = opprio;
continue; continue;
} else if (Unsigned(LOCAL_tokptr->TokInfo) == '[' && } else if (Unsigned(LOCAL_tokptr->TokInfo) == '[' &&
IsPosfixOp(AtomEmptySquareBrackets, &opprio, &oplprio PASS_REGS) IsPosfixOp(AtomEmptySquareBrackets, &opprio, &oplprio PASS_REGS)
&& opprio <= prio && oplprio >= curprio) { && opprio <= prio && oplprio >= curprio) {
t = ParseArgs(AtomEmptySquareBrackets, (Term)']', FailBuff, t PASS_REGS); t = ParseArgs(AtomEmptySquareBrackets, ']', FailBuff, t PASS_REGS);
t = MakeAccessor(t, FunctorEmptySquareBrackets);
curprio = opprio; curprio = opprio;
continue; continue;
} else if (Unsigned(LOCAL_tokptr->TokInfo) == '{' && } else if (Unsigned(LOCAL_tokptr->TokInfo) == '{' &&
IsPosfixOp(AtomEmptyCurlyBrackets, &opprio, &oplprio PASS_REGS) IsPosfixOp(AtomEmptyCurlyBrackets, &opprio, &oplprio PASS_REGS)
&& opprio <= prio && oplprio >= curprio) { && opprio <= prio && oplprio >= curprio) {
t = ParseArgs(AtomEmptyCurlyBrackets, (Term)'}', FailBuff, t PASS_REGS); t = ParseArgs(AtomEmptyCurlyBrackets, '}', FailBuff, t PASS_REGS);
t = MakeAccessor(t, FunctorEmptyCurlyBrackets);
curprio = opprio; curprio = opprio;
continue; continue;
} }

View File

@ -977,7 +977,16 @@ writeTerm(Term t, int p, int depth, int rinfixarg, struct write_globs *wglb, str
Yap_IsPosfixOp(atom, &op, &lp)) { Yap_IsPosfixOp(atom, &op, &lp)) {
Term tleft = ArgOfTerm(1, t); Term tleft = ArgOfTerm(1, t);
int bracket_left = int bracket_left, offset;
if (Arity != 1) {
tleft = ArgOfTerm(1, t);
offset = 2;
} else {
tleft = ArgOfTerm(2, t);
offset = 1;
}
bracket_left =
!IsVarTerm(tleft) && !IsVarTerm(tleft) &&
IsAtomTerm(tleft) && IsAtomTerm(tleft) &&
Yap_IsOp(AtomOfTerm(tleft)); Yap_IsOp(AtomOfTerm(tleft));
@ -988,7 +997,7 @@ writeTerm(Term t, int p, int depth, int rinfixarg, struct write_globs *wglb, str
if (bracket_left) { if (bracket_left) {
wropen_bracket(wglb, TRUE); wropen_bracket(wglb, TRUE);
} }
writeTerm(from_pointer(RepAppl(t)+1, &nrwt, wglb), lp, depth + 1, rinfixarg, wglb, &nrwt); writeTerm(from_pointer(RepAppl(t)+offset, &nrwt, wglb), lp, depth + 1, rinfixarg, wglb, &nrwt);
restore_from_write(&nrwt, wglb); restore_from_write(&nrwt, wglb);
if (bracket_left) { if (bracket_left) {
wrclose_bracket(wglb, TRUE); wrclose_bracket(wglb, TRUE);
@ -1002,20 +1011,7 @@ writeTerm(Term t, int p, int depth, int rinfixarg, struct write_globs *wglb, str
wrputc('{', wglb->stream); wrputc('{', wglb->stream);
} }
lastw = separator; lastw = separator;
for (op = 2; op <= Arity; ++op) { write_list(ArgOfTerm(1,t), 0, depth, wglb, rwt);
if (op == wglb->MaxArgs) {
wrputc('.', wglb->stream);
wrputc('.', wglb->stream);
wrputc('.', wglb->stream);
break;
}
writeTerm(from_pointer(RepAppl(t)+op, &nrwt, wglb), 999, depth + 1, FALSE, wglb, &nrwt);
restore_from_write(&nrwt, wglb);
if (op != Arity) {
wrputc(',', wglb->stream);
lastw = separator;
}
}
if (atom == AtomEmptyBrackets) { if (atom == AtomEmptyBrackets) {
wrputc(')', wglb->stream); wrputc(')', wglb->stream);
} else if (atom == AtomEmptySquareBrackets) { } else if (atom == AtomEmptySquareBrackets) {

View File

@ -382,6 +382,8 @@
FunctorDot7 = Yap_MkFunctor(AtomDot,7); FunctorDot7 = Yap_MkFunctor(AtomDot,7);
FunctorDot8 = Yap_MkFunctor(AtomDot,8); FunctorDot8 = Yap_MkFunctor(AtomDot,8);
FunctorDot9 = Yap_MkFunctor(AtomDot,9); FunctorDot9 = Yap_MkFunctor(AtomDot,9);
FunctorEmptySquareBrackets = Yap_MkFunctor(AtomEmptySquareBrackets,2);
FunctorEmptyCurlyBrackets = Yap_MkFunctor(AtomEmptyCurlyBrackets,2);
FunctorEq = Yap_MkFunctor(AtomEq,2); FunctorEq = Yap_MkFunctor(AtomEq,2);
FunctorError = Yap_MkFunctor(AtomError,2); FunctorError = Yap_MkFunctor(AtomError,2);
FunctorEvaluationError = Yap_MkFunctor(AtomEvaluationError,1); FunctorEvaluationError = Yap_MkFunctor(AtomEvaluationError,1);

View File

@ -382,6 +382,8 @@
FunctorDot7 = FuncAdjust(FunctorDot7); FunctorDot7 = FuncAdjust(FunctorDot7);
FunctorDot8 = FuncAdjust(FunctorDot8); FunctorDot8 = FuncAdjust(FunctorDot8);
FunctorDot9 = FuncAdjust(FunctorDot9); FunctorDot9 = FuncAdjust(FunctorDot9);
FunctorEmptySquareBrackets = FuncAdjust(FunctorEmptySquareBrackets);
FunctorEmptyCurlyBrackets = FuncAdjust(FunctorEmptyCurlyBrackets);
FunctorEq = FuncAdjust(FunctorEq); FunctorEq = FuncAdjust(FunctorEq);
FunctorError = FuncAdjust(FunctorError); FunctorError = FuncAdjust(FunctorError);
FunctorEvaluationError = FuncAdjust(FunctorEvaluationError); FunctorEvaluationError = FuncAdjust(FunctorEvaluationError);

View File

@ -762,6 +762,10 @@
#define FunctorDot8 Yap_heap_regs->FunctorDot8_ #define FunctorDot8 Yap_heap_regs->FunctorDot8_
Functor FunctorDot9_; Functor FunctorDot9_;
#define FunctorDot9 Yap_heap_regs->FunctorDot9_ #define FunctorDot9 Yap_heap_regs->FunctorDot9_
Functor FunctorEmptySquareBrackets_;
#define FunctorEmptySquareBrackets Yap_heap_regs->FunctorEmptySquareBrackets_
Functor FunctorEmptyCurlyBrackets_;
#define FunctorEmptyCurlyBrackets Yap_heap_regs->FunctorEmptyCurlyBrackets_
Functor FunctorEq_; Functor FunctorEq_;
#define FunctorEq Yap_heap_regs->FunctorEq_ #define FunctorEq Yap_heap_regs->FunctorEq_
Functor FunctorError_; Functor FunctorError_;

View File

@ -387,6 +387,8 @@ F Dot6 Dot 6
F Dot7 Dot 7 F Dot7 Dot 7
F Dot8 Dot 8 F Dot8 Dot 8
F Dot9 Dot 9 F Dot9 Dot 9
F EmptySquareBrackets EmptySquareBrackets 2
F EmptyCurlyBrackets EmptyCurlyBrackets 2
F Eq Eq 2 F Eq Eq 2
F Error Error 2 F Error Error 2
F EvaluationError EvaluationError 1 F EvaluationError EvaluationError 1