diff --git a/C/parser.c b/C/parser.c index 050e6898e..51b763208 100644 --- a/C/parser.c +++ b/C/parser.c @@ -69,8 +69,8 @@ typedef struct jmp_buff_struct { } JMPBUFF; static void GNextToken( CACHE_TYPE1 ); -static void checkfor(Term, JMPBUFF * CACHE_TYPE); -static Term ParseArgs(Atom, Term, JMPBUFF *, Term CACHE_TYPE); +static void checkfor(wchar_t, JMPBUFF * CACHE_TYPE); +static Term ParseArgs(Atom, wchar_t, JMPBUFF *, Term CACHE_TYPE); static Term ParseList(JMPBUFF * CACHE_TYPE); static Term ParseTerm(int, JMPBUFF * CACHE_TYPE); @@ -315,16 +315,16 @@ GNextToken( USES_REGS1 ) } 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) - || LOCAL_tokptr->TokInfo != c) + || LOCAL_tokptr->TokInfo != (Term)c) FAIL; NextToken; } 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; Term *p, t; @@ -405,6 +405,18 @@ ParseArgs(Atom a, Term close, JMPBUFF *FailBuff, Term arg1 USES_REGS) 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 ParseList(JMPBUFF *FailBuff USES_REGS) @@ -540,7 +552,7 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS) } if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok) && Unsigned(LOCAL_tokptr->TokInfo) == 'l') - t = ParseArgs((Atom) t, (Term)')', FailBuff, 0L PASS_REGS); + t = ParseArgs((Atom) t, ')', FailBuff, 0L PASS_REGS); else t = MkAtomTerm((Atom)t); break; @@ -606,7 +618,7 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS) case 'l': /* non solo ( */ NextToken; t = ParseTerm(1200, FailBuff PASS_REGS); - checkfor((Term) ')', FailBuff PASS_REGS); + checkfor(')', FailBuff PASS_REGS); break; case '[': NextToken; @@ -617,7 +629,7 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS) break; } t = ParseList(FailBuff PASS_REGS); - checkfor((Term) ']', FailBuff PASS_REGS); + checkfor(']', FailBuff PASS_REGS); break; case '{': NextToken; @@ -634,7 +646,7 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS) LOCAL_ErrorMessage = "Stack Overflow"; FAIL; } - checkfor((Term) '}', FailBuff PASS_REGS); + checkfor('}', FailBuff PASS_REGS); break; default: FAIL; @@ -734,19 +746,21 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS) } else if (Unsigned(LOCAL_tokptr->TokInfo) == '(' && IsPosfixOp(AtomEmptyBrackets, &opprio, &oplprio PASS_REGS) && opprio <= prio && oplprio >= curprio) { - t = ParseArgs(AtomEmptyBrackets, (Term)')', FailBuff, t PASS_REGS); + t = ParseArgs(AtomEmptyBrackets, ')', FailBuff, t PASS_REGS); curprio = opprio; continue; } else if (Unsigned(LOCAL_tokptr->TokInfo) == '[' && IsPosfixOp(AtomEmptySquareBrackets, &opprio, &oplprio PASS_REGS) && 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; continue; } else if (Unsigned(LOCAL_tokptr->TokInfo) == '{' && IsPosfixOp(AtomEmptyCurlyBrackets, &opprio, &oplprio PASS_REGS) && 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; continue; } diff --git a/C/write.c b/C/write.c index 3a1ee7c65..38e3f8c2e 100644 --- a/C/write.c +++ b/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)) { 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) && IsAtomTerm(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) { 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); if (bracket_left) { 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); } lastw = separator; - for (op = 2; op <= Arity; ++op) { - 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; - } - } + write_list(ArgOfTerm(1,t), 0, depth, wglb, rwt); if (atom == AtomEmptyBrackets) { wrputc(')', wglb->stream); } else if (atom == AtomEmptySquareBrackets) { diff --git a/H/iatoms.h b/H/iatoms.h index 4e9ad227c..fd5fbb5d6 100644 --- a/H/iatoms.h +++ b/H/iatoms.h @@ -382,6 +382,8 @@ FunctorDot7 = Yap_MkFunctor(AtomDot,7); FunctorDot8 = Yap_MkFunctor(AtomDot,8); FunctorDot9 = Yap_MkFunctor(AtomDot,9); + FunctorEmptySquareBrackets = Yap_MkFunctor(AtomEmptySquareBrackets,2); + FunctorEmptyCurlyBrackets = Yap_MkFunctor(AtomEmptyCurlyBrackets,2); FunctorEq = Yap_MkFunctor(AtomEq,2); FunctorError = Yap_MkFunctor(AtomError,2); FunctorEvaluationError = Yap_MkFunctor(AtomEvaluationError,1); diff --git a/H/ratoms.h b/H/ratoms.h index 816990b4e..31b466fec 100644 --- a/H/ratoms.h +++ b/H/ratoms.h @@ -382,6 +382,8 @@ FunctorDot7 = FuncAdjust(FunctorDot7); FunctorDot8 = FuncAdjust(FunctorDot8); FunctorDot9 = FuncAdjust(FunctorDot9); + FunctorEmptySquareBrackets = FuncAdjust(FunctorEmptySquareBrackets); + FunctorEmptyCurlyBrackets = FuncAdjust(FunctorEmptyCurlyBrackets); FunctorEq = FuncAdjust(FunctorEq); FunctorError = FuncAdjust(FunctorError); FunctorEvaluationError = FuncAdjust(FunctorEvaluationError); diff --git a/H/tatoms.h b/H/tatoms.h index 8c8b3998b..2ace62582 100644 --- a/H/tatoms.h +++ b/H/tatoms.h @@ -762,6 +762,10 @@ #define FunctorDot8 Yap_heap_regs->FunctorDot8_ Functor 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_; #define FunctorEq Yap_heap_regs->FunctorEq_ Functor FunctorError_; diff --git a/misc/ATOMS b/misc/ATOMS index 0e198499d..eb5bed1b3 100644 --- a/misc/ATOMS +++ b/misc/ATOMS @@ -387,6 +387,8 @@ F Dot6 Dot 6 F Dot7 Dot 7 F Dot8 Dot 8 F Dot9 Dot 9 +F EmptySquareBrackets EmptySquareBrackets 2 +F EmptyCurlyBrackets EmptyCurlyBrackets 2 F Eq Eq 2 F Error Error 2 F EvaluationError EvaluationError 1