18static char SccsId[] =
"%W% %G%";
50#define Volatile volatile
61static void GNextToken(CACHE_TYPE1);
62static void checkfor(Term,
JMPBUFF *, encoding_t CACHE_TYPE);
63static Term ParseArgs(
Atom, Term,
JMPBUFF *, Term, encoding_t, Term CACHE_TYPE);
64static Term ParseList(
JMPBUFF *, encoding_t, Term CACHE_TYPE);
65static Term ParseTerm(
int,
JMPBUFF *, encoding_t, Term CACHE_TYPE);
68extern const char *Yap_tokText(
void *tokptr);
70static void syntax_msg(
const char *msg, ...) {
73 if (!LOCAL_Error_TYPE ||
74 (LOCAL_Error_TYPE == SYNTAX_ERROR &&
75 LOCAL_toktide->TokPos < LOCAL_ActiveError->parserPos)) {
76 if (!LOCAL_ErrorMessage) {
77 LOCAL_ErrorMessage = malloc(MAX_ERROR_MSG_SIZE + 1);
80 vsnprintf(LOCAL_ErrorMessage, MAX_ERROR_MSG_SIZE, msg, ap);
87 Volatile JMPBUFF *saveenv, newenv; \
88 Volatile TokEntry *saveT = LOCAL_tokptr; \
89 Volatile CELL *saveH = HR; \
90 Volatile int savecurprio = curprio; \
92 if (!sigsetjmp(newenv.JmpBuff, 0)) { \
100 curprio = savecurprio; \
101 LOCAL_tokptr = saveT; \
105#define TRY3(S, P, F) \
107 Volatile JMPBUFF *saveenv, newenv; \
108 Volatile TokEntry *saveT = LOCAL_tokptr; \
109 Volatile CELL *saveH = HR; \
110 saveenv = FailBuff; \
111 if (!sigsetjmp(newenv.JmpBuff, 0)) { \
112 FailBuff = &newenv; \
114 FailBuff = saveenv; \
117 FailBuff = saveenv; \
119 LOCAL_tokptr = saveT; \
124#define FAIL siglongjmp(FailBuff->JmpBuff, 1)
126VarEntry *Yap_LookupVar(
const char *var)
131 Atom vat = Yap_LookupAtom(var);
134 if (GLOBAL_Option[4])
135 fprintf(stderr,
"[LookupVar %s]", var);
137 if (var[0] !=
'_' || var[1] !=
'\0') {
142 hv = HashFunction((
unsigned char *)var) % AtomHashTableSize;
147 if ((scmp = strcmp(var, RepAtom(p->VarRep)->StrOfAE)) == 0) {
150 }
else if (scmp < 0) {
157 }
else if (hv < hpv) {
167 p->VarLeft = p->VarRight = NULL;
174 p->VarLeft = LOCAL_AnonVarTable;
175 LOCAL_AnonVarTable = p;
184 LOCAL_VarTail->VarNext = p;
192static Term VarNames(
VarEntry *p, Term l USES_REGS) {
194 Atom AtomUnderscore = Yap_LookupAtom(
"_");
199 p->VarRep == AtomUnderscore ) {
203 t[0] = MkAtomTerm(p->VarRep);
205 o = Yap_MkApplTerm(FunctorEq, 2, t);
206 o = MkPairTerm(o, l);
213 if (HR > ASP - 4096) {
215 longjmp(LOCAL_IOBotch, 1);
223Term Yap_VarNames(
VarEntry *p, Term l) {
225 return VarNames(p, l PASS_REGS);
228static Term Singletons(
VarEntry *p, Term l USES_REGS) {
231 if (RepAtom(p->VarRep)->StrOfAE[0] !=
'_' && p->refs == 1) {
235 t[0] = MkAtomTerm(p->VarRep);
237 o = Yap_MkApplTerm(FunctorEq, 2, t);
238 o = MkPairTerm(o, l);
245 if (HR > ASP - 4096) {
247 longjmp(LOCAL_IOBotch, 1);
255Term Yap_Singletons(
VarEntry *p, Term l) {
257 return Singletons(p, l PASS_REGS);
260static Term Variables(
VarEntry *p, Term l USES_REGS) {
266 o = MkPairTerm(o, l);
273 if (HR > ASP - 4096) {
275 longjmp(LOCAL_IOBotch, 1);
282Term Yap_Variables(
VarEntry *p, Term l) {
284 l = Variables(p, l PASS_REGS);
285 return Variables(p, l PASS_REGS);
288static int IsPrefixOp(
Atom op,
int *pptr,
int *rpptr, Term cmod USES_REGS) {
291 OpEntry *opp = Yap_GetOpProp(op, PREFIX_OP, cmod PASS_REGS);
294 if (opp->OpModule && opp->OpModule != cmod) {
295 READ_UNLOCK(opp->OpRWLock);
298 if ((p = opp->Prefix) != 0) {
299 READ_UNLOCK(opp->OpRWLock);
300 *pptr = *rpptr = p & MaskPrio;
305 READ_UNLOCK(opp->OpRWLock);
310int Yap_IsPrefixOp(
Atom op,
int *pptr,
int *rpptr) {
312 return IsPrefixOp(op, pptr, rpptr, CurrentModule PASS_REGS);
315static int IsInfixOp(
Atom op,
int *pptr,
int *lpptr,
int *rpptr,
316 Term cmod USES_REGS) {
319 OpEntry *opp = Yap_GetOpProp(op, INFIX_OP, cmod PASS_REGS);
322 if (opp->OpModule && opp->OpModule != cmod) {
323 READ_UNLOCK(opp->OpRWLock);
326 if ((p = opp->Infix) != 0) {
327 READ_UNLOCK(opp->OpRWLock);
328 *pptr = *rpptr = *lpptr = p & MaskPrio;
335 READ_UNLOCK(opp->OpRWLock);
340int Yap_IsInfixOp(
Atom op,
int *pptr,
int *lpptr,
int *rpptr) {
342 return IsInfixOp(op, pptr, lpptr, rpptr, CurrentModule PASS_REGS);
345static int IsPosfixOp(
Atom op,
int *pptr,
int *lpptr, Term cmod USES_REGS) {
348 OpEntry *opp = Yap_GetOpProp(op, POSFIX_OP, cmod PASS_REGS);
351 if (opp->OpModule && opp->OpModule != cmod) {
352 READ_UNLOCK(opp->OpRWLock);
355 if ((p = opp->Posfix) != 0) {
356 READ_UNLOCK(opp->OpRWLock);
357 *pptr = *lpptr = p & MaskPrio;
362 READ_UNLOCK(opp->OpRWLock);
367int Yap_IsPosfixOp(
Atom op,
int *pptr,
int *lpptr) {
369 return IsPosfixOp(op, pptr, lpptr, CurrentModule PASS_REGS);
372inline static void GNextToken(USES_REGS1) {
373 if (LOCAL_tokptr->Tok == Ord(eot_tok)) {
374 LOCAL_ErrorMessage = NULL;
377 if (LOCAL_tokptr == LOCAL_toktide) {
378 LOCAL_toktide = LOCAL_tokptr = LOCAL_tokptr->TokNext;
380 LOCAL_tokptr = LOCAL_tokptr->TokNext;
383inline static void checkfor(Term c,
JMPBUFF *FailBuff,
384 encoding_t enc USES_REGS) {
385 if (LOCAL_tokptr->Tok != Ord(Ponctuation_tok) || LOCAL_tokptr->TokInfo != c) {
387 strncpy(s, Yap_tokText(LOCAL_tokptr), 1023);
388 syntax_msg(
"line %d: expected to find "
389 "\'%c....................................\', found %s",
390 LOCAL_tokptr->TokLine, c, s);
398 size_t sz = LOCAL_ParserAuxMax-LOCAL_ParserAuxBase, off = LOCAL_ParserAuxSp-LOCAL_ParserAuxBase;
399 fprintf(stderr,
"%lx:::%p\n",off,LOCAL_ParserAuxBase);
401 if (sz > 4096*K) sz = sz/2+ 4096*K;
402 if ((LOCAL_ParserAuxBase = Realloc(LOCAL_ParserAuxBase, sz*
sizeof(Term)) )== NULL) {
403 Yap_ThrowError(RESOURCE_ERROR_AUXILIARY_STACK, TermNil,
"line %d: Parser Stack Overflow", LOCAL_tokptr->TokLine);
406 fprintf(stderr,
"%lx:::%p\n",sz,LOCAL_ParserAuxBase);
407 LOCAL_ParserAuxSp = LOCAL_ParserAuxBase+off;
408 LOCAL_ParserAuxMax = LOCAL_ParserAuxBase+sz;
411#ifdef O_QUASIQUOTATIONS
413static int is_quasi_quotation_syntax(Term goal,
Atom *pat, encoding_t enc,
421 t = Yap_StripModule(goal, &
m);
422 f = FunctorOfTerm(t);
423 *pat = at = NameOfFunctor(f);
424 arity = ArityOfFunctor(f);
430static int get_quasi_quotation(term_t t,
unsigned char **here,
431 unsigned char *ein) {
432 unsigned char *in, *start = *here;
434 for (in = start; in <= ein; in++) {
435 if (in[0] ==
'}' && in[-1] ==
'|') {
439 if (LOCAL_quasi_quotations)
444 txt.text.t = (
char *)start;
445 txt.length = in - start;
446 txt.storage = PL_CHARS_HEAP;
447 txt.encoding = ENC_UTF8;
448 txt.canonical = FALSE;
450 rc = PL_unify_text(t, 0, &txt, PL_CODE_LIST);
455 return PL_unify_term(t, PL_FUNCTOR, FUNCTOR_dquasi_quotation3,
456 PL_POINTER, LOCAL, PL_INTPTR, (intptr_t)(start),
457 PL_INTPTR, (intptr_t)(in - start));
466static Term ParseArgs(
Atom a, Term close,
JMPBUFF *FailBuff, Term arg1,
467 encoding_t enc, Term cmod USES_REGS) {
473 SFEntry *pe = (SFEntry *)Yap_GetAProp(a, SFProperty);
477 p = LOCAL_ParserAuxSp-LOCAL_ParserAuxBase;
479 intptr_t diff = LOCAL_ParserAuxSp-LOCAL_ParserAuxBase;
480 LOCAL_ParserAuxBase[p] = arg1;
482 if (p+32>=LOCAL_ParserAuxMax-LOCAL_ParserAuxBase)
483 grow_aux (PASS_REGS1);
484 LOCAL_ParserAuxSp = LOCAL_ParserAuxBase+(p+1);
485 if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok) &&
486 LOCAL_tokptr->TokInfo == close) {
488 func = Yap_MkFunctor(a, 41);
490 LOCAL_Error_TYPE = RESOURCE_ERROR_HEAP;
493 t = Yap_MkApplTerm(func, nargs, LOCAL_ParserAuxSp+diff);
494 if (HR > ASP - 4096) {
495 LOCAL_Error_TYPE = RESOURCE_ERROR_STACK;
499 if (p+16>=LOCAL_ParserAuxMax-LOCAL_ParserAuxBase)
500 grow_aux (PASS_REGS1);
502 LOCAL_ParserAuxSp = LOCAL_ParserAuxBase+p;
507 Term *tp = LOCAL_ParserAuxSp;
508 if (tp + 16 >= LOCAL_ParserAuxMax) {
509 grow_aux (PASS_REGS1);tp = LOCAL_ParserAuxSp;
511 *tp++ = ParseTerm(999, FailBuff, enc, cmod PASS_REGS);
512 LOCAL_ParserAuxSp = tp;
514 if (LOCAL_tokptr->Tok != Ord(Ponctuation_tok))
516 if (LOCAL_tokptr->TokInfo != TermComma)
520 if (p+16>=LOCAL_ParserAuxMax-LOCAL_ParserAuxBase)
521 grow_aux (PASS_REGS1);
522 LOCAL_ParserAuxSp = LOCAL_ParserAuxBase+p;
527 if (HR > ASP - (nargs + 1024)) {
531 func = Yap_MkFunctor(a, nargs);
533 LOCAL_Error_TYPE = RESOURCE_ERROR_HEAP;
538 t = MkSFTerm(Yap_MkFunctor(a, SFArity), nargs, p, pe->NilValue);
540 t = Yap_MkApplTerm(Yap_MkFunctor(a, nargs), nargs, p);
542 if (a == AtomDBref && nargs == 2)
543 t = MkDBRefTerm((
DBRef)IntegerOfTerm(LOCAL_ParserAuxBase[p]));
545 t = Yap_MkApplTerm(func, nargs, LOCAL_ParserAuxBase+p);
547 if (HR > ASP - 4096) {
548 LOCAL_Error_TYPE = RESOURCE_ERROR_STACK;
552 checkfor(close, FailBuff, enc PASS_REGS);
556static Term MakeAccessor(Term t,
Functor f USES_REGS) {
557 UInt arity = ArityOfFunctor(FunctorOfTerm(t));
559 Term tf[2], tl = TermNil;
561 tf[1] = ArgOfTerm(1, t);
562 for (i = arity; i > 1; i--) {
563 tl = MkPairTerm(ArgOfTerm(i, t), tl);
566 return Yap_MkApplTerm(f, 2, tf);
569static Term ParseList(
JMPBUFF *FailBuff, encoding_t enc, Term cmod USES_REGS) {
576 to_store[0] = ParseTerm(999, FailBuff, enc, cmod PASS_REGS);
577 if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)) {
578 if (LOCAL_tokptr->TokInfo == TermComma) {
582 if (HR > ASP - 4096) {
583 to_store[1] = TermNil;
584 LOCAL_Error_TYPE = RESOURCE_ERROR_STACK;
588 to_store[1] = AbsPair(HR);
592 }
else if (LOCAL_tokptr->TokInfo == TermVBar) {
594 to_store[1] = ParseTerm(999, FailBuff, enc, cmod PASS_REGS);
596 to_store[1] = MkAtomTerm(AtomNil);
599 syntax_msg(
"line %d: looking for symbol ',','|' got symbol '%s'",
600 LOCAL_tokptr->TokLine, Yap_tokText(LOCAL_tokptr));
606static Term ParseTerm(
int prio,
JMPBUFF *FailBuff, encoding_t enc,
607 Term cmod USES_REGS) {
612 Volatile
int curprio = 0, opprio, oplprio, oprprio;
613 Volatile
Atom opinfo;
615 switch (LOCAL_tokptr->Tok) {
617 t = LOCAL_tokptr->TokInfo;
620 if (LOCAL_tokptr->Tok == Number_tok) {
621 if (t == TermMinus) {
622 t = LOCAL_tokptr->TokInfo;
624 t = MkIntTerm(-IntOfTerm(t));
625 else if (IsFloatTerm(t))
626 t = MkFloatTerm(-FloatOfTerm(t));
628 else if (IsBigIntTerm(t)) {
629 t = Yap_gmp_neg_big(t);
633 t = MkLongIntTerm(-LongIntOfTerm(t));
638 if ((LOCAL_tokptr->Tok != Ord(Ponctuation_tok) ||
639 LOCAL_tokptr->TokInfo != Terml) &&
640 IsPrefixOp(AtomOfTerm(t), &opprio, &oprprio, cmod PASS_REGS)) {
641 if (LOCAL_tokptr->Tok == Name_tok) {
642 Atom at = AtomOfTerm(LOCAL_tokptr->TokInfo);
646 t = MkFloatTerm(INFINITY);
649 }
else if (at == AtomNan) {
650 t = MkFloatTerm(NAN);
654 }
else if (t == TermMinus) {
656 t = MkFloatTerm(-INFINITY);
659 }
else if (at == AtomNan) {
660 t = MkFloatTerm(NAN);
667 if (opprio <= prio) {
671 func = Yap_MkFunctor(AtomOfTerm(t), 1);
if (func == NULL) {
672 LOCAL_Error_TYPE = RESOURCE_ERROR_HEAP;
673 syntax_msg(
"line %d: Heap Overflow", LOCAL_tokptr->TokLine);
675 } t = ParseTerm(oprprio, FailBuff, enc, cmod PASS_REGS);
676 t = Yap_MkApplTerm(func, 1, &t);
678 if (HR > ASP - 4096) {
679 syntax_msg(
"line %d: Stack Overflow", LOCAL_tokptr->TokLine);
681 LOCAL_Error_TYPE = RESOURCE_ERROR_STACK;
686 if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok) &&
687 LOCAL_tokptr->TokInfo == Terml)
688 t = ParseArgs(AtomOfTerm(t), TermEndBracket, FailBuff, 0L, enc,
693 t = LOCAL_tokptr->TokInfo;
698 t = LOCAL_tokptr->TokInfo;
703 varinfo = (
VarEntry *)(LOCAL_tokptr->TokInfo);
704 if ((t = varinfo->VarAdr) == TermNil) {
705 t = varinfo->VarAdr = MkVarTerm();
711 syntax_msg(
"line %d: found ill-formed \"%s\"", LOCAL_tokptr->TokLine,
712 Yap_tokText(LOCAL_tokptr));
715 case Ponctuation_tok:
717 switch (RepAtom(AtomOfTerm(LOCAL_tokptr->TokInfo))->StrOfAE[0]) {
721 t = ParseTerm(GLOBAL_MaxPriority, FailBuff, enc, cmod PASS_REGS);
722 checkfor(TermEndBracket, FailBuff, enc PASS_REGS);
726 if (LOCAL_tokptr->Tok == Ponctuation_tok &&
727 LOCAL_tokptr->TokInfo == TermEndSquareBracket) {
732 t = ParseList(FailBuff, enc, cmod PASS_REGS);
733 checkfor(TermEndSquareBracket, FailBuff, enc PASS_REGS);
737 if (LOCAL_tokptr->Tok == Ponctuation_tok &&
738 (
int)LOCAL_tokptr->TokInfo == TermEndCurlyBracket) {
739 t = MkAtomTerm(AtomBraces);
743 t = ParseTerm(GLOBAL_MaxPriority, FailBuff, enc, cmod PASS_REGS);
744 t = Yap_MkApplTerm(FunctorBraces, 1, &t);
746 if (HR > ASP - 4096) {
747 LOCAL_Error_TYPE = RESOURCE_ERROR_STACK;
748 syntax_msg(
"line %d: Stack Overflow", LOCAL_tokptr->TokLine);
751 checkfor(TermEndCurlyBracket, FailBuff, enc PASS_REGS);
754 syntax_msg(
"line %d: unexpected ponctuation signal %s",
755 LOCAL_tokptr->TokLine,
Yap_tokRep(LOCAL_tokptr));
761 case QuasiQuotes_tok: {
762 qq_t *qq = (
qq_t *)(LOCAL_tokptr->TokInfo);
763 term_t pv, positions = LOCAL_subtpos, to;
771 LOCAL_varnames = PL_new_term_ref();
773 if (LOCAL_quasi_quotations) {
774 LOCAL_qq = LOCAL_quasi_quotations;
776 if (!(LOCAL_qq = PL_new_term_ref()))
781 if (!(pv = PL_new_term_refs(3)) ||
782 !PL_unify_term(positions, PL_FUNCTOR,
783 FUNCTOR_quasi_quotation_position5, PL_INTPTR,
784 qq->start.charno, PL_VARIABLE, PL_TERM,
786 PL_TERM, pv + 1, PL_TERM, pv + 2))
792 if (!(LOCAL_qq_tail = PL_copy_term_ref(LOCAL_qq)))
797 t = ParseTerm(GLOBAL_MaxPriority, FailBuff, enc, cmod PASS_REGS);
798 if (LOCAL_tokptr->Tok != QuasiQuotes_tok) {
799 syntax_msg(
"expected to find quasi quotes, got \"%s\"", ,
800 Yap_tokText(LOCAL_tokptr));
803 if (!(is_quasi_quotation_syntax(t, &at))) {
804 syntax_msg(
"bad quasi quotation syntax, at \"%s\"",
805 Yap_tokText(LOCAL_tokptr));
809 tn = Yap_MkNewApplTerm(SWIFunctorToFunctor(FUNCTOR_quasi_quotation4), 4);
810 tnp = RepAppl(tn) + 1;
811 tnp[0] = MkAtomTerm(at);
812 if (!get_quasi_quotation(Yap_InitSlot(ArgOfTerm(2, tn)), &qq->text,
813 qq->text + strlen((
const char *)qq->text))) {
814 syntax_msg(
"could not get quasi quotation, at \"%s\"",
815 Yap_tokText(LOCAL_tokptr));
819 intptr_t qqend = qq->end.charno;
822 if (!PL_unify_term(Yap_InitSlot(ArgOfTerm(2, t)), PL_FUNCTOR,
823 FUNCTOR_minus2, PL_INTPTR,
825 PL_INTPTR, qqend - 2))
826 syntax_msg(
"failed to unify quasi quotation, at \"%s\"",
827 Yap_tokText(LOCAL_tokptr));
831 tnp[2] = Yap_GetFromSlot(LOCAL_varnames);
833 t = ArgOfTerm(4, tn);
834 if (!(to = PL_new_term_ref()) ||
835 !PL_unify_list(LOCAL_qq_tail, to, LOCAL_qq_tail) ||
836 !PL_unify(to, Yap_InitSlot(tn))) {
837 syntax_msg(
"failed to unify quasi quotation, at \"%s\"",
846 syntax_msg(
"line %d: expected operator, got \'%s\'", LOCAL_tokptr->TokLine,
847 Yap_tokText(LOCAL_tokptr));
854 if (LOCAL_tokptr->Tok == Ord(Name_tok) &&
855 Yap_HasOp((name = AtomOfTerm(LOCAL_tokptr->TokInfo)))) {
856 Atom save_opinfo = opinfo = name;
857 if (IsInfixOp(save_opinfo, &opprio, &oplprio, &oprprio, cmod PASS_REGS) &&
858 opprio <= prio && oplprio >= curprio) {
860 Volatile
int oldprio = curprio;
862 func = Yap_MkFunctor(save_opinfo, 2);
if (func == NULL) {
863 syntax_msg(
"line %d: Heap Overflow", LOCAL_tokptr->TokLine);
869 args[1] = ParseTerm(oprprio, FailBuff, enc, cmod PASS_REGS);
870 t = Yap_MkApplTerm(func, 2, args);
872 if (HR > ASP - 4096) {
873 syntax_msg(
"line %d: Stack Overflow", LOCAL_tokptr->TokLine);
878 opinfo = save_opinfo;
continue;, opinfo = save_opinfo;
881 if (IsPosfixOp(opinfo, &opprio, &oplprio, cmod PASS_REGS) &&
882 opprio <= prio && oplprio >= curprio) {
884 Functor func = Yap_MkFunctor(AtomOfTerm(LOCAL_tokptr->TokInfo), 1);
886 syntax_msg(
"line %d: Heap Overflow", LOCAL_tokptr->TokLine);
889 t = Yap_MkApplTerm(func, 1, &t);
891 if (HR > ASP - 4096) {
892 syntax_msg(
"line %d: Stack Overflow", LOCAL_tokptr->TokLine);
901 if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)) {
902 if (LOCAL_tokptr->TokInfo == TermComma && prio >= 1000 &&
904 Volatile Term args[2];
907 args[1] = ParseTerm(1000, FailBuff, enc, cmod PASS_REGS);
908 t = Yap_MkApplTerm(FunctorComma, 2, args);
910 if (HR > ASP - 4096) {
911 syntax_msg(
"line %d: Stack Overflow", LOCAL_tokptr->TokLine);
916 }
else if (LOCAL_tokptr->TokInfo == TermVBar &&
917 IsInfixOp(AtomVBar, &opprio, &oplprio, &oprprio,
919 opprio <= prio && oplprio >= curprio) {
920 Volatile Term args[2];
923 args[1] = ParseTerm(oprprio, FailBuff, enc, cmod PASS_REGS);
924 t = Yap_MkApplTerm(FunctorVBar, 2, args);
926 if (HR > ASP - 4096) {
927 syntax_msg(
"line %d: Stack Overflow", LOCAL_tokptr->TokLine);
932 }
else if (LOCAL_tokptr->TokInfo == TermBeginBracket &&
933 IsPosfixOp(AtomEmptyBrackets, &opprio, &oplprio,
935 opprio <= prio && oplprio >= curprio) {
936 t = ParseArgs(AtomEmptyBrackets, TermEndBracket, FailBuff, t, enc,
940 }
else if (LOCAL_tokptr->TokInfo == TermBeginSquareBracket &&
941 IsPosfixOp(AtomEmptySquareBrackets, &opprio, &oplprio,
943 opprio <= prio && oplprio >= curprio) {
944 t = ParseArgs(AtomEmptySquareBrackets, TermEndSquareBracket, FailBuff,
945 t, enc, cmod PASS_REGS);
946 t = MakeAccessor(t, FunctorEmptySquareBrackets PASS_REGS);
949 }
else if (LOCAL_tokptr->TokInfo == TermBeginCurlyBracket &&
950 IsPosfixOp(AtomBraces, &opprio, &oplprio, cmod PASS_REGS) &&
951 opprio <= prio && oplprio >= curprio) {
952 t = ParseArgs(AtomBraces, TermEndCurlyBracket, FailBuff, t, enc,
954 t = MakeAccessor(t, FunctorBraces PASS_REGS);
959 if (LOCAL_tokptr->Tok <= Ord(String_tok)) {
960 syntax_msg(
"line %d: expected operator, got \'%s\'",
961 LOCAL_tokptr->TokLine, Yap_tokText(LOCAL_tokptr));
969Term Yap_Parse(UInt prio, encoding_t enc, Term cmod) {
973 LOCAL_ActiveError->errorMsg=NULL;
974 LOCAL_ActiveError->errorMsgLen=0;
977 yhandle_t sls = Yap_StartSlots();
978 LOCAL_ErrorMessage = NULL;
979 LOCAL_toktide = LOCAL_tokptr;
981 if (!sigsetjmp(FailBuff.JmpBuff, 0)) {
982 LOCAL_ActiveError->errorMsg=NULL;
983 LOCAL_ActiveError->errorMsgLen=0;
984 LOCAL_ParserAuxSp = LOCAL_ParserAuxBase =
Malloc(4096*
sizeof(CELL));
985 LOCAL_ParserAuxMax = LOCAL_ParserAuxBase+4096;
986 t = ParseTerm(prio, &FailBuff, enc, cmod PASS_REGS);
988 if (GLOBAL_Option[
'p' -
'a' + 1]) {
989 Yap_DebugPlWrite(MkIntTerm(LOCAL_tokptr->TokLine));
990 Yap_DebugPutc(stderr,
'[');
992 Yap_DebugPlWrite(MkIntTerm(0));
995 Yap_DebugPutc(stderr,
']');
996 Yap_DebugPutc(stderr,
'\n');
1001 if (LOCAL_tokptr != NULL && LOCAL_tokptr->Tok != Ord(eot_tok)) {
1002 LOCAL_Error_TYPE =SYNTAX_ERROR;
1003 if (LOCAL_tokptr->TokNext) {
1004 size_t sz = strlen(
"bracket or operator expected.");
1005 LOCAL_ErrorMessage =malloc(sz+1);
1006 strncpy(LOCAL_ErrorMessage,
"bracket or operator expected.", sz );
1008 size_t sz = strlen(
"term must end with . or EOF.");
1009 LOCAL_ErrorMessage =malloc(sz+1);
1010 strncpy(LOCAL_ErrorMessage,
"term must end with . or EOF.", sz );
1014 if (t != 0 && LOCAL_Error_TYPE == SYNTAX_ERROR) {
1015 LOCAL_Error_TYPE = YAP_NO_ERROR;
1016 LOCAL_ErrorMessage = NULL;
Term Yap_tokRep(void *tokptr)
convert a token to text
void * Malloc(size_t sz USES_REGS)
allocate a temporary text block