make syntax extensions SWI compatible
This commit is contained in:
parent
e1208fc7ad
commit
2cfa0081ad
38
C/parser.c
38
C/parser.c
@ -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;
|
||||||
}
|
}
|
||||||
|
28
C/write.c
28
C/write.c
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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_;
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user