| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /*************************************************************************
 | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	 YAP Prolog 							 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	Yap Prolog was developed at NCCUP - Universidade do Porto	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | ************************************************************************** | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * File:		parser.c						 * | 
					
						
							|  |  |  | * Last rev:								 * | 
					
						
							|  |  |  | * mods:									 * | 
					
						
							|  |  |  | * comments:	Prolog's parser						 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *************************************************************************/ | 
					
						
							|  |  |  | #ifdef SCCS
 | 
					
						
							|  |  |  | static char SccsId[] = "%W% %G%"; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2014-09-15 03:13:50 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-24 15:32:29 +00:00
										 |  |  | @defgroup YAPSyntax YAP Syntax | 
					
						
							| 
									
										
										
										
											2014-09-15 03:13:50 -05:00
										 |  |  | @ingroup YAPProgramming | 
					
						
							|  |  |  | @{ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | We will describe the syntax of YAP at two levels. We first will | 
					
						
							|  |  |  | describe the syntax for Prolog terms. In a second level we describe | 
					
						
							|  |  |  | the \a tokens from which Prolog \a terms are | 
					
						
							|  |  |  | built. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @defgroup Formal_Syntax Syntax of Terms | 
					
						
							|  |  |  | @ingroup Syntax | 
					
						
							|  |  |  | @{ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Below, we describe the syntax of YAP terms from the different | 
					
						
							|  |  |  | classes of tokens defined above. The formalism used will be <em>BNF</em>, | 
					
						
							|  |  |  | extended where necessary with attributes denoting integer precedence or | 
					
						
							|  |  |  | operator type. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |                                                                   term | 
					
						
							|  |  |  | ---->     subterm(1200)   end_of_term_marker | 
					
						
							| 
									
										
										
										
											2014-09-15 03:13:50 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |  subterm(N) ---->     term(M)         [M <= N] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  term(N)    ---->     op(N, fx) subterm(N-1) | 
					
						
							|  |  |  |              |        op(N, fy) subterm(N) | 
					
						
							|  |  |  |              |        subterm(N-1) op(N, xfx) subterm(N-1) | 
					
						
							|  |  |  |              |        subterm(N-1) op(N, xfy) subterm(N) | 
					
						
							|  |  |  |              |        subterm(N) op(N, yfx) subterm(N-1) | 
					
						
							|  |  |  |              |        subterm(N-1) op(N, xf) | 
					
						
							|  |  |  |              |        subterm(N) op(N, yf) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  term(0)   ---->      atom '(' arguments ')' | 
					
						
							|  |  |  |              |        '(' subterm(1200)  ')' | 
					
						
							|  |  |  |              |        '{' subterm(1200)  '}' | 
					
						
							|  |  |  |              |        list | 
					
						
							|  |  |  |              |        string | 
					
						
							|  |  |  |              |        number | 
					
						
							|  |  |  |              |        atom | 
					
						
							|  |  |  |              |        variable | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  arguments ---->      subterm(999) | 
					
						
							|  |  |  |              |        subterm(999) ',' arguments | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  list      ---->      '[]' | 
					
						
							|  |  |  |              |        '[' list_expr ']' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  list_expr ---->      subterm(999) | 
					
						
							|  |  |  |              |        subterm(999) list_tail | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  list_tail ---->      ',' list_expr | 
					
						
							|  |  |  |              |        ',..' subterm(999) | 
					
						
							|  |  |  |              |        '|' subterm(999) | 
					
						
							|  |  |  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Notes: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    + \a op(N,T) denotes an atom which has been previously declared with type | 
					
						
							|  |  |  |       \a T and base precedence \a N. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   + Since ',' is itself a pre-declared operator with type \a xfy and | 
					
						
							|  |  |  |        precedence 1000, is \a subterm starts with a '(', \a op must be | 
					
						
							|  |  |  |        followed by a space to avoid ambiguity with the case of a functor | 
					
						
							|  |  |  |        followed by arguments, e.g.: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
					
						
							|  |  |  | + (a,b)        [the same as '+'(','(a,b)) of arity one] | 
					
						
							|  |  |  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
					
						
							|  |  |  |       versus | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
					
						
							|  |  |  | +(a,b)         [the same as '+'(a,b) of arity two] | 
					
						
							|  |  |  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   + | 
					
						
							| 
									
										
										
										
											2014-09-15 03:13:50 -05:00
										 |  |  | In the first rule for term(0) no blank space should exist between | 
					
						
							|  |  |  | \a atom and '('. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   + | 
					
						
							| 
									
										
										
										
											2014-09-15 03:13:50 -05:00
										 |  |  | Each term to be read by the YAP parser must end with a single | 
					
						
							|  |  |  | dot, followed by a blank (in the sense mentioned in the previous | 
					
						
							|  |  |  | paragraph). When a name consisting of a single dot could be taken for | 
					
						
							|  |  |  | the end of term marker, the ambiguity should be avoided by surrounding the | 
					
						
							|  |  |  | dot with single quotes. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |  * Description: | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |  * parser:     produces a prolog term from an array of tokens | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * parser usage: the parser takes its input from an array of token descriptions | 
					
						
							|  |  |  |  * addressed by the global variable 'tokptr' and produces a Term as result. A | 
					
						
							|  |  |  |  * macro 'NextToken' should be defined in 'yap.h' for advancing 'tokptr' from | 
					
						
							|  |  |  |  * one token to the next. In the distributed version this macro also updates | 
					
						
							|  |  |  |  * a variable named 'toktide' for keeping track of how far the parser went | 
					
						
							|  |  |  |  * before failling with a syntax error. The parser should be invoked with | 
					
						
							|  |  |  |  * 'tokptr' pointing to the first token. The last token should have type | 
					
						
							|  |  |  |  * 'eot_tok'. The parser return either a Term. Syntactic errors are signaled | 
					
						
							|  |  |  |  * by a return value 0. The parser builds new terms on the 'global stack' and | 
					
						
							|  |  |  |  * also uses an auxiliary stack pointed to by 'AuxSp'. In the distributed | 
					
						
							|  |  |  |  * version this auxiliary stack is assumed to grow downwards. This | 
					
						
							|  |  |  |  * assumption, however, is only relevant to routine 'ParseArgs', and to the | 
					
						
							|  |  |  |  * variable toktide. conclusion: set tokptr pointing to first token set AuxSp | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |  * Call Parse | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |  * VSC: Working whithout known bugs in 87/4/6 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |  * LD: -I or +I evaluated by parser 87/4/28 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |  * LD: parser extended 87/4/28 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Yap.h"
 | 
					
						
							|  |  |  | #include "Yatom.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-23 14:22:17 +01:00
										 |  |  | #include "YapHeap.h"
 | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  | #include "YapText.h"
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "yapio.h"
 | 
					
						
							| 
									
										
										
										
											2010-05-28 15:29:20 +01:00
										 |  |  | #include "eval.h"
 | 
					
						
							| 
									
										
										
										
											2013-11-13 12:57:52 +00:00
										 |  |  | /* stuff we want to use in standard YAP code */ | 
					
						
							| 
									
										
										
										
											2015-06-18 08:09:31 +01:00
										 |  |  | #include "iopreds.h"
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #if HAVE_STRING_H
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  | #if HAVE_STDARG_H
 | 
					
						
							|  |  |  | #include <stdarg.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | #ifdef __STDC__XXX
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #define Volatile volatile
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define Volatile
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* weak backtraking mechanism based on long_jump */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | typedef struct jmp_buff_struct { sigjmp_buf JmpBuff; } JMPBUFF; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | static void GNextToken(CACHE_TYPE1); | 
					
						
							|  |  |  | static void checkfor(wchar_t, JMPBUFF *CACHE_TYPE); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  | static Term ParseArgs(Atom, wchar_t, JMPBUFF *, Term CACHE_TYPE); | 
					
						
							|  |  |  | static Term ParseList(JMPBUFF *CACHE_TYPE); | 
					
						
							|  |  |  | static Term ParseTerm(int, JMPBUFF *CACHE_TYPE); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-21 17:05:36 -05:00
										 |  |  | const char *Yap_tokRep(TokEntry *tokptr); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  | static void syntax_msg(const char *msg, ...) { | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   va_list ap; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (LOCAL_toktide == LOCAL_tokptr) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |     char out[YAP_FILENAME_MAX]; | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |     va_start(ap, msg); | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |     vsnprintf(out, YAP_FILENAME_MAX - 1, msg, ap); | 
					
						
							|  |  |  |     LOCAL_Error_Term = MkStringTerm( out ); | 
					
						
							|  |  |  |    LOCAL_Error_TYPE = SYNTAX_ERROR; | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |     va_end(ap); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | #define TRY(S, P)                                                              \
 | 
					
						
							|  |  |  |   {                                                                            \ | 
					
						
							|  |  |  |     Volatile JMPBUFF *saveenv, newenv;                                         \ | 
					
						
							|  |  |  |     Volatile TokEntry *saveT = LOCAL_tokptr;                                   \ | 
					
						
							|  |  |  |     Volatile CELL *saveH = HR;                                                 \ | 
					
						
							|  |  |  |     Volatile int savecurprio = curprio;                                        \ | 
					
						
							|  |  |  |     saveenv = FailBuff;                                                        \ | 
					
						
							|  |  |  |     if (!sigsetjmp(newenv.JmpBuff, 0)) {                                       \ | 
					
						
							|  |  |  |       FailBuff = &newenv;                                                      \ | 
					
						
							|  |  |  |       S;                                                                       \ | 
					
						
							|  |  |  |       FailBuff = saveenv;                                                      \ | 
					
						
							|  |  |  |       P;                                                                       \ | 
					
						
							|  |  |  |     } else {                                                                   \ | 
					
						
							|  |  |  |       FailBuff = saveenv;                                                      \ | 
					
						
							|  |  |  |       HR = saveH;                                                              \ | 
					
						
							|  |  |  |       curprio = savecurprio;                                                   \ | 
					
						
							|  |  |  |       LOCAL_tokptr = saveT;                                                    \ | 
					
						
							|  |  |  |     }                                                                          \ | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define TRY3(S, P, F)                                                          \
 | 
					
						
							|  |  |  |   {                                                                            \ | 
					
						
							|  |  |  |     Volatile JMPBUFF *saveenv, newenv;                                         \ | 
					
						
							|  |  |  |     Volatile TokEntry *saveT = LOCAL_tokptr;                                   \ | 
					
						
							|  |  |  |     Volatile CELL *saveH = HR;                                                 \ | 
					
						
							|  |  |  |     saveenv = FailBuff;                                                        \ | 
					
						
							|  |  |  |     if (!sigsetjmp(newenv.JmpBuff, 0)) {                                       \ | 
					
						
							|  |  |  |       FailBuff = &newenv;                                                      \ | 
					
						
							|  |  |  |       S;                                                                       \ | 
					
						
							|  |  |  |       FailBuff = saveenv;                                                      \ | 
					
						
							|  |  |  |       P;                                                                       \ | 
					
						
							|  |  |  |     } else {                                                                   \ | 
					
						
							|  |  |  |       FailBuff = saveenv;                                                      \ | 
					
						
							|  |  |  |       HR = saveH;                                                              \ | 
					
						
							|  |  |  |       LOCAL_tokptr = saveT;                                                    \ | 
					
						
							|  |  |  |       F                                                                        \ | 
					
						
							|  |  |  |     }                                                                          \ | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define FAIL siglongjmp(FailBuff->JmpBuff, 1)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  | VarEntry * | 
					
						
							|  |  |  | Yap_LookupVar(const char *var) /* lookup variable in variables table   */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   VarEntry *p; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-13 17:04:34 +00:00
										 |  |  | #if DEBUG
 | 
					
						
							| 
									
										
										
										
											2011-05-25 16:40:36 +01:00
										 |  |  |   if (GLOBAL_Option[4]) | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     fprintf(stderr, "[LookupVar %s]", var); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |   if (var[0] != '_' || var[1] != '\0') { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     VarEntry **op = &LOCAL_VarTable; | 
					
						
							| 
									
										
										
										
											2003-10-06 13:49:38 +00:00
										 |  |  |     UInt hv; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     p = LOCAL_VarTable; | 
					
						
							| 
									
										
										
										
											2015-09-21 17:05:36 -05:00
										 |  |  |     hv = HashFunction((unsigned char *)var) % AtomHashTableSize; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     while (p != NULL) { | 
					
						
							|  |  |  |       CELL hpv = p->hv; | 
					
						
							|  |  |  |       if (hv == hpv) { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         Int scmp; | 
					
						
							|  |  |  |         if ((scmp = strcmp(var, p->VarRep)) == 0) { | 
					
						
							|  |  |  |           p->refs++; | 
					
						
							|  |  |  |           return (p); | 
					
						
							|  |  |  |         } else if (scmp < 0) { | 
					
						
							|  |  |  |           op = &(p->VarLeft); | 
					
						
							|  |  |  |           p = p->VarLeft; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           op = &(p->VarRight); | 
					
						
							|  |  |  |           p = p->VarRight; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } else if (hv < hpv) { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         op = &(p->VarLeft); | 
					
						
							|  |  |  |         p = p->VarLeft; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         op = &(p->VarRight); | 
					
						
							|  |  |  |         p = p->VarRight; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     p = (VarEntry *)Yap_AllocScannerMemory(strlen(var) + sizeof(VarEntry)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     *op = p; | 
					
						
							|  |  |  |     p->VarLeft = p->VarRight = NULL; | 
					
						
							|  |  |  |     p->hv = hv; | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |     p->refs = 1L; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     strcpy(p->VarRep, var); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     /* anon var */ | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     p = (VarEntry *)Yap_AllocScannerMemory(sizeof(VarEntry) + 2); | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     p->VarLeft = LOCAL_AnonVarTable; | 
					
						
							|  |  |  |     LOCAL_AnonVarTable = p; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     p->VarRight = NULL; | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |     p->refs = 0L; | 
					
						
							|  |  |  |     p->hv = 1L; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     p->VarRep[0] = '_'; | 
					
						
							|  |  |  |     p->VarRep[1] = '\0'; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   p->VarAdr = TermNil; | 
					
						
							|  |  |  |   return (p); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | static Term VarNames(VarEntry *p, Term l USES_REGS) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (p != NULL) { | 
					
						
							|  |  |  |     if (strcmp(p->VarRep, "_") != 0) { | 
					
						
							| 
									
										
										
										
											2012-10-08 18:25:17 +01:00
										 |  |  |       Term t[2]; | 
					
						
							|  |  |  |       Term o; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-08 18:25:17 +01:00
										 |  |  |       t[0] = MkAtomTerm(Yap_LookupAtom(p->VarRep)); | 
					
						
							| 
									
										
										
										
											2015-08-18 14:47:01 -05:00
										 |  |  |       if (!IsVarTerm(p->VarAdr)) | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |         p->VarAdr = MkVarTerm(); | 
					
						
							| 
									
										
										
										
											2012-10-08 18:25:17 +01:00
										 |  |  |       t[1] = p->VarAdr; | 
					
						
							|  |  |  |       o = Yap_MkApplTerm(FunctorEq, 2, t); | 
					
						
							|  |  |  |       o = MkPairTerm(o, VarNames(p->VarRight, | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |                                  VarNames(p->VarLeft, l PASS_REGS) PASS_REGS)); | 
					
						
							|  |  |  |       if (HR > ASP - 4096) { | 
					
						
							|  |  |  |         save_machine_regs(); | 
					
						
							|  |  |  |         siglongjmp(LOCAL_IOBotch, 1); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       return (o); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       return VarNames(p->VarRight, VarNames(p->VarLeft, l PASS_REGS) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return (l); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | Term Yap_VarNames(VarEntry *p, Term l) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   return VarNames(p, l PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | static Term Singletons(VarEntry *p, Term l USES_REGS) { | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |   if (p != NULL) { | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     if (p->VarRep[0] != '_' && p->refs == 1) { | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |       Term t[2]; | 
					
						
							|  |  |  |       Term o; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |       t[0] = MkAtomTerm(Yap_LookupAtom(p->VarRep)); | 
					
						
							|  |  |  |       t[1] = p->VarAdr; | 
					
						
							|  |  |  |       o = Yap_MkApplTerm(FunctorEq, 2, t); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       o = MkPairTerm(o, | 
					
						
							|  |  |  |                      Singletons(p->VarRight, | 
					
						
							|  |  |  |                                 Singletons(p->VarLeft, l PASS_REGS) PASS_REGS)); | 
					
						
							|  |  |  |       if (HR > ASP - 4096) { | 
					
						
							|  |  |  |         save_machine_regs(); | 
					
						
							|  |  |  |         siglongjmp(LOCAL_IOBotch, 1); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       return (o); | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       return Singletons(p->VarRight, | 
					
						
							|  |  |  |                         Singletons(p->VarLeft, l PASS_REGS) PASS_REGS); | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return (l); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | Term Yap_Singletons(VarEntry *p, Term l) { | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   return Singletons(p, l PASS_REGS); | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | static Term Variables(VarEntry *p, Term l USES_REGS) { | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |   if (p != NULL) { | 
					
						
							|  |  |  |     Term o; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     o = MkPairTerm( | 
					
						
							|  |  |  |         p->VarAdr, | 
					
						
							|  |  |  |         Variables(p->VarRight, Variables(p->VarLeft, l PASS_REGS) PASS_REGS)); | 
					
						
							|  |  |  |     if (HR > ASP - 4096) { | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |       save_machine_regs(); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       siglongjmp(LOCAL_IOBotch, 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return (o); | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     return (l); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | Term Yap_Variables(VarEntry *p, Term l) { | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   return Variables(p, l PASS_REGS); | 
					
						
							| 
									
										
										
										
											2013-11-18 12:57:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | static int IsPrefixOp(Atom op, int *pptr, int *rpptr USES_REGS) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   int p; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   OpEntry *opp = Yap_GetOpProp(op, PREFIX_OP PASS_REGS); | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |   if (!opp) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   if (opp->OpModule && opp->OpModule != CurrentModule) { | 
					
						
							| 
									
										
										
										
											2011-09-20 11:36:49 +01:00
										 |  |  |     READ_UNLOCK(opp->OpRWLock); | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-09-20 11:36:49 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |   if ((p = opp->Prefix) != 0) { | 
					
						
							|  |  |  |     READ_UNLOCK(opp->OpRWLock); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     *pptr = *rpptr = p &MaskPrio; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (p & DcrrpFlag) | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       --*rpptr; | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |     READ_UNLOCK(opp->OpRWLock); | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | int Yap_IsPrefixOp(Atom op, int *pptr, int *rpptr) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   return IsPrefixOp(op, pptr, rpptr PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | static int IsInfixOp(Atom op, int *pptr, int *lpptr, int *rpptr USES_REGS) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   int p; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   OpEntry *opp = Yap_GetOpProp(op, INFIX_OP PASS_REGS); | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |   if (!opp) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   if (opp->OpModule && opp->OpModule != CurrentModule) { | 
					
						
							| 
									
										
										
										
											2011-09-20 11:36:49 +01:00
										 |  |  |     READ_UNLOCK(opp->OpRWLock); | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-09-20 11:36:49 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |   if ((p = opp->Infix) != 0) { | 
					
						
							|  |  |  |     READ_UNLOCK(opp->OpRWLock); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     *pptr = *rpptr = *lpptr = p &MaskPrio; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (p & DcrrpFlag) | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       --*rpptr; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (p & DcrlpFlag) | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       --*lpptr; | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |     return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |     READ_UNLOCK(opp->OpRWLock); | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | int Yap_IsInfixOp(Atom op, int *pptr, int *lpptr, int *rpptr) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   return IsInfixOp(op, pptr, lpptr, rpptr PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | static int IsPosfixOp(Atom op, int *pptr, int *lpptr USES_REGS) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   int p; | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-14 08:58:10 +01:00
										 |  |  |   OpEntry *opp = Yap_GetOpProp(op, POSFIX_OP PASS_REGS); | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |   if (!opp) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   if (opp->OpModule && opp->OpModule != CurrentModule) { | 
					
						
							| 
									
										
										
										
											2011-09-20 11:36:49 +01:00
										 |  |  |     READ_UNLOCK(opp->OpRWLock); | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2011-09-20 11:36:49 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |   if ((p = opp->Posfix) != 0) { | 
					
						
							|  |  |  |     READ_UNLOCK(opp->OpRWLock); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     *pptr = *lpptr = p &MaskPrio; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (p & DcrlpFlag) | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       --*lpptr; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (TRUE); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |     READ_UNLOCK(opp->OpRWLock); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return (FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | int Yap_IsPosfixOp(Atom op, int *pptr, int *lpptr) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							|  |  |  |   return IsPosfixOp(op, pptr, lpptr PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | inline static void GNextToken(USES_REGS1) { | 
					
						
							|  |  |  |   if (LOCAL_tokptr->Tok == Ord(eot_tok)) | 
					
						
							|  |  |  |     return; | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |   if (LOCAL_tokptr == LOCAL_toktide) { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     LOCAL_toktide = LOCAL_tokptr = LOCAL_tokptr->TokNext; | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |   } else | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     LOCAL_tokptr = LOCAL_tokptr->TokNext; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | inline static void checkfor(wchar_t c, JMPBUFF *FailBuff USES_REGS) { | 
					
						
							|  |  |  |   if (LOCAL_tokptr->Tok != Ord(Ponctuation_tok) || | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |       LOCAL_tokptr->TokInfo != (Term)c) { | 
					
						
							| 
									
										
										
										
											2015-09-21 17:05:36 -05:00
										 |  |  |     char s[1024]; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     strncpy(s, Yap_tokRep(LOCAL_tokptr), 1023); | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |     syntax_msg("line %d: expected to find \'%c\', found %s", LOCAL_tokptr->TokPos, c, s); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     FAIL; | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   NextToken; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-25 11:24:13 +01:00
										 |  |  | #ifdef O_QUASIQUOTATIONS
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  | static int is_quasi_quotation_syntax(Term goal, Atom *pat) { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2013-11-25 11:24:13 +01:00
										 |  |  |   Term m = CurrentModule, t; | 
					
						
							|  |  |  |   Atom at; | 
					
						
							|  |  |  |   UInt arity; | 
					
						
							|  |  |  |   Functor f; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t = Yap_StripModule(goal, &m); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   f = FunctorOfTerm(t); | 
					
						
							|  |  |  |   *pat = at = NameOfFunctor(f); | 
					
						
							|  |  |  |   arity = ArityOfFunctor(f); | 
					
						
							|  |  |  |   if (arity > 0) | 
					
						
							| 
									
										
										
										
											2013-11-25 11:24:13 +01:00
										 |  |  |     return TRUE; | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | static int get_quasi_quotation(term_t t, unsigned char **here, | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |                                unsigned char *ein) { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   unsigned char *in, *start = *here; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (in = start; in <= ein; in++) { | 
					
						
							|  |  |  |     if (in[0] == '}' && in[-1] == '|') { | 
					
						
							|  |  |  |       *here = in + 1; /* after } */ | 
					
						
							|  |  |  |       in--;           /* Before | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |       if (LOCAL_quasi_quotations) /* option; must return strings */ | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       { | 
					
						
							|  |  |  |         PL_chars_t txt; | 
					
						
							|  |  |  |         int rc; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         txt.text.t = (char *)start; | 
					
						
							|  |  |  |         txt.length = in - start; | 
					
						
							|  |  |  |         txt.storage = PL_CHARS_HEAP; | 
					
						
							|  |  |  |         txt.encoding = ENC_UTF8; | 
					
						
							|  |  |  |         txt.canonical = FALSE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         rc = PL_unify_text(t, 0, &txt, PL_CODE_LIST); | 
					
						
							|  |  |  |         PL_free_text(&txt); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return rc; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         return PL_unify_term(t, PL_FUNCTOR, FUNCTOR_dquasi_quotation3, | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |                              PL_POINTER, LOCAL, PL_INTPTR, (intptr_t)(start), | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |                              PL_INTPTR, (intptr_t)(in - start)); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-11-25 11:24:13 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2013-11-25 11:24:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   return FALSE; // errorWarning("end_of_file_in_quasi_quotation", 0, _PL_rd);
 | 
					
						
							| 
									
										
										
										
											2013-11-25 11:24:13 +01:00
										 |  |  | } | 
					
						
							|  |  |  | #endif /*O_QUASIQUOTATIONS*/
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  | static Term ParseArgs(Atom a, wchar_t close, JMPBUFF *FailBuff, | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |                       Term arg1 USES_REGS) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   int nargs = 0; | 
					
						
							|  |  |  |   Term *p, t; | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   Functor func; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef SFUNC
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   SFEntry *pe = (SFEntry *)Yap_GetAProp(a, SFProperty); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   NextToken; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   p = (Term *)ParserAuxSp; | 
					
						
							| 
									
										
										
										
											2013-07-07 16:15:25 -05:00
										 |  |  |   if (arg1) { | 
					
						
							|  |  |  |     *p = arg1; | 
					
						
							|  |  |  |     nargs++; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     ParserAuxSp = (char *)(p + 1); | 
					
						
							|  |  |  |     if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok) && | 
					
						
							|  |  |  |         LOCAL_tokptr->TokInfo == close) { | 
					
						
							| 
									
										
										
										
											2013-07-07 16:15:25 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |       func = Yap_MkFunctor(a, 1); | 
					
						
							|  |  |  |       if (func == NULL) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |         syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos ); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         FAIL; | 
					
						
							| 
									
										
										
										
											2013-07-07 16:15:25 -05:00
										 |  |  |       } | 
					
						
							|  |  |  |       t = Yap_MkApplTerm(func, nargs, p); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       if (HR > ASP - 4096) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |         syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos ); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         return TermNil; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-07-07 16:15:25 -05:00
										 |  |  |       NextToken; | 
					
						
							|  |  |  |       return t; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   while (1) { | 
					
						
							|  |  |  |     Term *tp = (Term *)ParserAuxSp; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     if (ParserAuxSp + 1 > LOCAL_TrailTop) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |       syntax_msg("line %d: Trail Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2004-10-28 20:12:23 +00:00
										 |  |  |       FAIL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     *tp++ = Unsigned(ParseTerm(999, FailBuff PASS_REGS)); | 
					
						
							| 
									
										
										
										
											2004-11-19 17:14:15 +00:00
										 |  |  |     ParserAuxSp = (char *)tp; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     ++nargs; | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     if (LOCAL_tokptr->Tok != Ord(Ponctuation_tok)) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       break; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     if (((int)LOCAL_tokptr->TokInfo) != ',') | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       break; | 
					
						
							|  |  |  |     NextToken; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-10-28 20:12:23 +00:00
										 |  |  |   ParserAuxSp = (char *)p; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /*
 | 
					
						
							|  |  |  |    * Needed because the arguments for the functor are placed in reverse | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |    * order | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |    */ | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   if (HR > ASP - (nargs + 1)) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |     syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2002-10-29 03:10:00 +00:00
										 |  |  |     FAIL; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   func = Yap_MkFunctor(a, nargs); | 
					
						
							|  |  |  |   if (func == NULL) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |     syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |     FAIL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #ifdef SFUNC
 | 
					
						
							|  |  |  |   if (pe) | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     t = MkSFTerm(Yap_MkFunctor(a, SFArity), nargs, p, pe->NilValue); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     t = Yap_MkApplTerm(Yap_MkFunctor(a, nargs), nargs, p); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   if (a == AtomDBref && nargs == 2) | 
					
						
							| 
									
										
										
										
											2004-02-13 18:39:29 +00:00
										 |  |  |     t = MkDBRefTerm((DBRef)IntegerOfTerm(p[0])); | 
					
						
							|  |  |  |   else | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |     t = Yap_MkApplTerm(func, nargs, p); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   if (HR > ASP - 4096) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |     syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2005-11-22 12:42:39 +00:00
										 |  |  |     return TermNil; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* check for possible overflow against local stack */ | 
					
						
							| 
									
										
										
										
											2013-07-07 16:15:25 -05:00
										 |  |  |   checkfor(close, FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2005-11-22 12:42:39 +00:00
										 |  |  |   return t; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | static Term MakeAccessor(Term t, Functor f USES_REGS) { | 
					
						
							| 
									
										
										
										
											2013-09-13 11:44:26 +01:00
										 |  |  |   UInt arity = ArityOfFunctor(FunctorOfTerm(t)), i; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   Term tf[2], tl = TermNil; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-13 11:44:26 +01:00
										 |  |  |   tf[1] = ArgOfTerm(1, t); | 
					
						
							|  |  |  |   for (i = arity; i > 1; i--) { | 
					
						
							|  |  |  |     tl = MkPairTerm(ArgOfTerm(i, t), tl); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   tf[0] = tl; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   return Yap_MkApplTerm(f, 2, tf); | 
					
						
							| 
									
										
										
										
											2013-09-13 11:44:26 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  | static Term ParseList(JMPBUFF *FailBuff USES_REGS) { | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  |   Term o; | 
					
						
							| 
									
										
										
										
											2002-10-28 17:46:55 +00:00
										 |  |  |   CELL *to_store; | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |   o = AbsPair(HR); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | loop: | 
					
						
							| 
									
										
										
										
											2014-01-19 21:15:05 +00:00
										 |  |  |   to_store = HR; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   HR += 2; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |   to_store[0] = ParseTerm(999, FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)) { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     if (((int)LOCAL_tokptr->TokInfo) == ',') { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       NextToken; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         /* check for possible overflow against local stack */ | 
					
						
							|  |  |  |         if (HR > ASP - 4096) { | 
					
						
							|  |  |  |           to_store[1] = TermNil; | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |           syntax_msg("line %d: Stack Overflow" ,LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |           FAIL; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           to_store[1] = AbsPair(HR); | 
					
						
							|  |  |  |           goto loop; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-10-28 17:46:55 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     } else if (((int)LOCAL_tokptr->TokInfo) == '|') { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       NextToken; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       to_store[1] = ParseTerm(999, FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2002-10-28 17:46:55 +00:00
										 |  |  |     } else { | 
					
						
							|  |  |  |       to_store[1] = MkAtomTerm(AtomNil); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |     syntax_msg("line %d: looking for symbol ',','|' got symbol '%s'",LOCAL_tokptr->TokPos, | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |                Yap_tokRep(LOCAL_tokptr)); | 
					
						
							|  |  |  |     FAIL; | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-10-28 17:46:55 +00:00
										 |  |  |   return (o); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  | static Term ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* parse term with priority prio */ | 
					
						
							|  |  |  |   Volatile Term t; | 
					
						
							|  |  |  |   Volatile Functor func; | 
					
						
							|  |  |  |   Volatile VarEntry *varinfo; | 
					
						
							|  |  |  |   Volatile int curprio = 0, opprio, oplprio, oprprio; | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |   Volatile Atom opinfo; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |   switch (LOCAL_tokptr->Tok) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   case Name_tok: | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     t = LOCAL_tokptr->TokInfo; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     NextToken; | 
					
						
							| 
									
										
										
										
											2011-04-26 18:51:02 +01:00
										 |  |  |     /* special rules apply for +1, -2.3, etc... */ | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     if (LOCAL_tokptr->Tok == Number_tok) { | 
					
						
							| 
									
										
										
										
											2011-04-26 18:51:02 +01:00
										 |  |  |       if ((Atom)t == AtomMinus) { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         t = LOCAL_tokptr->TokInfo; | 
					
						
							|  |  |  |         if (IsIntTerm(t)) | 
					
						
							|  |  |  |           t = MkIntTerm(-IntOfTerm(t)); | 
					
						
							|  |  |  |         else if (IsFloatTerm(t)) | 
					
						
							|  |  |  |           t = MkFloatTerm(-FloatOfTerm(t)); | 
					
						
							| 
									
										
										
										
											2011-04-26 18:51:02 +01:00
										 |  |  | #ifdef USE_GMP
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         else if (IsBigIntTerm(t)) { | 
					
						
							|  |  |  |           t = Yap_gmp_neg_big(t); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-04-26 18:51:02 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         else | 
					
						
							|  |  |  |           t = MkLongIntTerm(-LongIntOfTerm(t)); | 
					
						
							|  |  |  |         NextToken; | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2011-04-26 18:51:02 +01:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     if ((LOCAL_tokptr->Tok != Ord(Ponctuation_tok) || | 
					
						
							|  |  |  |          Unsigned(LOCAL_tokptr->TokInfo) != 'l') && | 
					
						
							|  |  |  |         IsPrefixOp((Atom)t, &opprio, &oprprio PASS_REGS)) { | 
					
						
							|  |  |  |       if (LOCAL_tokptr->Tok == Name_tok) { | 
					
						
							|  |  |  |         Atom at = (Atom)LOCAL_tokptr->TokInfo; | 
					
						
							| 
									
										
										
										
											2002-02-04 16:12:54 +00:00
										 |  |  | #ifndef _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         if ((Atom)t == AtomPlus) { | 
					
						
							|  |  |  |           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; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-02-04 16:12:54 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       if (opprio <= prio) { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         /* try to parse as a prefix operator */ | 
					
						
							|  |  |  |         TRY( | 
					
						
							|  |  |  |             /* build appl on the heap */ | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |             func = Yap_MkFunctor((Atom)t, 1); if (func == NULL) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |               syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |               FAIL; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             t = ParseTerm(oprprio, FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |             t = Yap_MkApplTerm(func, 1, &t); | 
					
						
							|  |  |  |             /* check for possible overflow against local stack */ | 
					
						
							|  |  |  |             if (HR > ASP - 4096) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |               syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |               FAIL; | 
					
						
							|  |  |  |             } curprio = opprio; | 
					
						
							|  |  |  |             , break;) | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok) && | 
					
						
							|  |  |  |         Unsigned(LOCAL_tokptr->TokInfo) == 'l') | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       t = ParseArgs((Atom)t, ')', FailBuff, 0L PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     else | 
					
						
							|  |  |  |       t = MkAtomTerm((Atom)t); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   case Number_tok: | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     t = LOCAL_tokptr->TokInfo; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     NextToken; | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |   case String_tok: /* build list on the heap */ | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Volatile char *p = (char *)LOCAL_tokptr->TokInfo; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     // we may be operating under a syntax error
 | 
					
						
							|  |  |  |     yap_error_number oerr = LOCAL_Error_TYPE; | 
					
						
							|  |  |  |     LOCAL_Error_TYPE = YAP_NO_ERROR; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     t = Yap_CharsToTDQ(p, CurrentModule, LOCAL_encoding PASS_REGS); | 
					
						
							|  |  |  |     if (!t) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |       syntax_msg("line %d: could not convert \"%s\"",LOCAL_tokptr->TokPos, (char *)LOCAL_tokptr->TokInfo); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       FAIL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     LOCAL_Error_TYPE = oerr; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     NextToken; | 
					
						
							|  |  |  |   } break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   case WString_tok: /* build list on the heap */ | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Volatile wchar_t *p = (wchar_t *)LOCAL_tokptr->TokInfo; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     // we may be operating under a syntax error
 | 
					
						
							|  |  |  |     yap_error_number oerr = LOCAL_Error_TYPE; | 
					
						
							|  |  |  |     LOCAL_Error_TYPE = YAP_NO_ERROR; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     t = Yap_WCharsToTDQ(p, CurrentModule PASS_REGS); | 
					
						
							|  |  |  |     if (!t) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |       syntax_msg("line %d: could not convert \'%S\'",LOCAL_tokptr->TokPos, (wchar_t *)LOCAL_tokptr->TokInfo); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       FAIL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |      LOCAL_Error_TYPE = oerr; | 
					
						
							|  |  |  |    NextToken; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |   } break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   case BQString_tok: /* build list on the heap */ | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Volatile char *p = (char *)LOCAL_tokptr->TokInfo; | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     // we may be operating under a syntax error
 | 
					
						
							|  |  |  |     yap_error_number oerr = LOCAL_Error_TYPE; | 
					
						
							|  |  |  |     LOCAL_Error_TYPE = YAP_NO_ERROR; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     t = Yap_CharsToTBQ(p, CurrentModule,  LOCAL_encoding PASS_REGS); | 
					
						
							|  |  |  |     if (!t) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |       syntax_msg("line %d: could not convert \'%s\"",LOCAL_tokptr->TokPos, (char *)LOCAL_tokptr->TokInfo); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       FAIL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     LOCAL_Error_TYPE = oerr; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     NextToken; | 
					
						
							|  |  |  |   } break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   case WBQString_tok: /* build list on the heap */ | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Volatile wchar_t *p = (wchar_t *)LOCAL_tokptr->TokInfo; | 
					
						
							|  |  |  |     t = Yap_WCharsToTBQ(p, CurrentModule PASS_REGS); | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     // we may be operating under a syntax error
 | 
					
						
							|  |  |  |     yap_error_number oerr = LOCAL_Error_TYPE; | 
					
						
							|  |  |  |     LOCAL_Error_TYPE = YAP_NO_ERROR; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     if (!t) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |       syntax_msg("line %d: could not convert \"%S\"",LOCAL_tokptr->TokPos, (wchar_t *)LOCAL_tokptr->TokInfo); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       FAIL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-01-03 02:06:09 +00:00
										 |  |  |     LOCAL_Error_TYPE = oerr; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     NextToken; | 
					
						
							|  |  |  |   } break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   case Var_tok: | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     varinfo = (VarEntry *)(LOCAL_tokptr->TokInfo); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if ((t = varinfo->VarAdr) == TermNil) { | 
					
						
							|  |  |  |       t = varinfo->VarAdr = MkVarTerm(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     NextToken; | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 17:10:45 +00:00
										 |  |  |   case Error_tok: | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |     syntax_msg("line %d: found ill-formed \"%s\"",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr)); | 
					
						
							| 
									
										
										
										
											2002-11-19 17:10:45 +00:00
										 |  |  |     FAIL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   case Ponctuation_tok: | 
					
						
							| 
									
										
										
										
											2015-08-07 16:57:53 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     switch ((int)LOCAL_tokptr->TokInfo) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     case '(': | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     case 'l': /* non solo ( */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       NextToken; | 
					
						
							| 
									
										
										
										
											2015-12-15 08:38:56 +00:00
										 |  |  |       t = ParseTerm(GLOBAL_MaxPriority, FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2013-09-13 11:44:26 +01:00
										 |  |  |       checkfor(')', FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       break; | 
					
						
							|  |  |  |     case '[': | 
					
						
							|  |  |  |       NextToken; | 
					
						
							| 
									
										
										
										
											2012-02-13 09:37:33 +00:00
										 |  |  |       if (LOCAL_tokptr->Tok == Ponctuation_tok && | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |           (int)LOCAL_tokptr->TokInfo == ']') { | 
					
						
							|  |  |  |         t = TermNil; | 
					
						
							|  |  |  |         NextToken; | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2012-02-13 09:37:33 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       t = ParseList(FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2013-09-13 11:44:26 +01:00
										 |  |  |       checkfor(']', FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       break; | 
					
						
							|  |  |  |     case '{': | 
					
						
							|  |  |  |       NextToken; | 
					
						
							| 
									
										
										
										
											2012-02-13 09:37:33 +00:00
										 |  |  |       if (LOCAL_tokptr->Tok == Ponctuation_tok && | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |           (int)LOCAL_tokptr->TokInfo == '}') { | 
					
						
							|  |  |  |         t = MkAtomTerm(AtomBraces); | 
					
						
							|  |  |  |         NextToken; | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2012-02-13 09:37:33 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-12-15 08:38:56 +00:00
										 |  |  |       t = ParseTerm(GLOBAL_MaxPriority, FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2009-12-03 22:51:29 +00:00
										 |  |  |       t = Yap_MkApplTerm(FunctorBraces, 1, &t); | 
					
						
							|  |  |  |       /* check for possible overflow against local stack */ | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       if (HR > ASP - 4096) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |         syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         FAIL; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-09-13 11:44:26 +01:00
										 |  |  |       checkfor('}', FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |       syntax_msg("line %d: unexpected ponctuation signal %s",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       FAIL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							| 
									
										
										
										
											2013-11-25 11:24:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  | #if QQ
 | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   case QuasiQuotes_tok: { | 
					
						
							|  |  |  |     qq_t *qq = (qq_t *)(LOCAL_tokptr->TokInfo); | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |     term_t pv, positions = LOCAL_subtpos, to; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     Atom at; | 
					
						
							|  |  |  |     Term tn; | 
					
						
							|  |  |  |     CELL *tnp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // from SWI, enter the list
 | 
					
						
							|  |  |  |     /* prepare (if we are the first in term) */ | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |     if (!LOCAL_varnames) | 
					
						
							|  |  |  |       LOCAL_varnames = PL_new_term_ref(); | 
					
						
							|  |  |  |     if (!LOCAL_qq) { | 
					
						
							|  |  |  |       if (LOCAL_quasi_quotations) { | 
					
						
							|  |  |  |         LOCAL_qq = LOCAL_quasi_quotations; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |         if (!(LOCAL_qq = PL_new_term_ref())) | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |           return FALSE; | 
					
						
							| 
									
										
										
										
											2013-11-25 11:24:13 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       //  create positions term
 | 
					
						
							|  |  |  |       if (positions) { | 
					
						
							|  |  |  |         if (!(pv = PL_new_term_refs(3)) || | 
					
						
							|  |  |  |             !PL_unify_term(positions, PL_FUNCTOR, | 
					
						
							|  |  |  |                            FUNCTOR_quasi_quotation_position5, PL_INTPTR, | 
					
						
							|  |  |  |                            qq->start.charno, PL_VARIABLE, PL_TERM, | 
					
						
							|  |  |  |                            pv + 0, // leave three open slots
 | 
					
						
							|  |  |  |                            PL_TERM, pv + 1, PL_TERM, pv + 2)) | 
					
						
							|  |  |  |           return FALSE; | 
					
						
							|  |  |  |       } else | 
					
						
							|  |  |  |         pv = 0; | 
					
						
							|  |  |  |       /* push type */ | 
					
						
							| 
									
										
										
										
											2013-11-25 11:24:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |       if (!(LOCAL_qq_tail = PL_copy_term_ref(LOCAL_qq))) | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         return FALSE; | 
					
						
							| 
									
										
										
										
											2013-11-25 11:24:13 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     NextToken; | 
					
						
							| 
									
										
										
										
											2015-12-15 08:38:56 +00:00
										 |  |  |     t = ParseTerm(GLOBAL_MaxPriority, FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     if (LOCAL_tokptr->Tok != QuasiQuotes_tok) { | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       syntax_msg("expected to find quasi quotes, got \"%s\"", , | 
					
						
							|  |  |  |                  Yap_tokRep(LOCAL_tokptr)); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       FAIL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |     if (!(is_quasi_quotation_syntax(t, &at))) { | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       syntax_msg("bad quasi quotation syntax, at \"%s\"", | 
					
						
							|  |  |  |                  Yap_tokRep(LOCAL_tokptr)); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       FAIL; | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     /* Arg 2: the content */ | 
					
						
							|  |  |  |     tn = Yap_MkNewApplTerm(SWIFunctorToFunctor(FUNCTOR_quasi_quotation4), 4); | 
					
						
							|  |  |  |     tnp = RepAppl(tn) + 1; | 
					
						
							|  |  |  |     tnp[0] = MkAtomTerm(at); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     if (!get_quasi_quotation(Yap_InitSlot(ArgOfTerm(2, tn)), &qq->text, | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |                              qq->text + strlen((const char *)qq->text))) { | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       syntax_msg("could not get quasi quotation, at \"%s\"", | 
					
						
							|  |  |  |                  Yap_tokRep(LOCAL_tokptr)); | 
					
						
							|  |  |  |       FAIL; | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     if (positions) { | 
					
						
							|  |  |  |       intptr_t qqend = qq->end.charno; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // set_range_position(positions, -1, qqend PASS_LD);
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |       if (!PL_unify_term(Yap_InitSlot(ArgOfTerm(2, t)), PL_FUNCTOR, | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |                          FUNCTOR_minus2, PL_INTPTR, | 
					
						
							|  |  |  |                          qq->mid.charno + 2,    /* end of | token */ | 
					
						
							|  |  |  |                          PL_INTPTR, qqend - 2)) /* end minus "|}" */ | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |         syntax_msg("failed to unify quasi quotation, at \"%s\"", | 
					
						
							|  |  |  |                    Yap_tokRep(LOCAL_tokptr)); | 
					
						
							|  |  |  |       FAIL; | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     tnp[2] = Yap_GetFromSlot(LOCAL_varnames); /* Arg 3: the var dictionary */ | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     /* Arg 4: the result */ | 
					
						
							|  |  |  |     t = ArgOfTerm(4, tn); | 
					
						
							|  |  |  |     if (!(to = PL_new_term_ref()) || | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |         !PL_unify_list(LOCAL_qq_tail, to, LOCAL_qq_tail) || | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |         !PL_unify(to, Yap_InitSlot(tn))) { | 
					
						
							|  |  |  |       syntax_msg("failed to unify quasi quotation, at \"%s\"", | 
					
						
							|  |  |  |                  Yap_tokRep(LOCAL_tokptr)); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       FAIL; | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-11-25 11:24:13 +01:00
										 |  |  |     NextToken; | 
					
						
							|  |  |  |     break; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   default: | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |     syntax_msg("line %d: expected operator, got \'%s\'",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     FAIL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* main loop to parse infix and posfix operators starts here */ | 
					
						
							| 
									
										
										
										
											2015-08-18 14:47:01 -05:00
										 |  |  |   while (true) { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |     if (LOCAL_tokptr->Tok == Ord(Name_tok) && | 
					
						
							|  |  |  |         Yap_HasOp((Atom)(LOCAL_tokptr->TokInfo))) { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       Atom save_opinfo = opinfo = (Atom)(LOCAL_tokptr->TokInfo); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       if (IsInfixOp(save_opinfo, &opprio, &oplprio, &oprprio PASS_REGS) && | 
					
						
							|  |  |  |           opprio <= prio && oplprio >= curprio) { | 
					
						
							|  |  |  |         /* try parsing as infix operator */ | 
					
						
							|  |  |  |         Volatile int oldprio = curprio; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |         TRY3( | 
					
						
							|  |  |  |             func = Yap_MkFunctor((Atom)LOCAL_tokptr->TokInfo, 2); | 
					
						
							|  |  |  |             if (func == NULL) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |               syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |               FAIL; | 
					
						
							|  |  |  |             } NextToken; | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               Term args[2]; | 
					
						
							|  |  |  |               args[0] = t; | 
					
						
							|  |  |  |               args[1] = ParseTerm(oprprio, FailBuff PASS_REGS); | 
					
						
							|  |  |  |               t = Yap_MkApplTerm(func, 2, args); | 
					
						
							|  |  |  |               /* check for possible overflow against local stack */ | 
					
						
							|  |  |  |               if (HR > ASP - 4096) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |                 syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |                 FAIL; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             curprio = opprio; | 
					
						
							|  |  |  |             opinfo = save_opinfo; continue;, opinfo = save_opinfo; | 
					
						
							|  |  |  |             curprio = oldprio;) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       if (IsPosfixOp(opinfo, &opprio, &oplprio PASS_REGS) && opprio <= prio && | 
					
						
							|  |  |  |           oplprio >= curprio) { | 
					
						
							|  |  |  |         /* parse as posfix operator */ | 
					
						
							|  |  |  |         Functor func = Yap_MkFunctor((Atom)LOCAL_tokptr->TokInfo, 1); | 
					
						
							|  |  |  |         if (func == NULL) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |           syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |           FAIL; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         t = Yap_MkApplTerm(func, 1, &t); | 
					
						
							|  |  |  |         /* check for possible overflow against local stack */ | 
					
						
							|  |  |  |         if (HR > ASP - 4096) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |           syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |           FAIL; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         curprio = opprio; | 
					
						
							|  |  |  |         NextToken; | 
					
						
							|  |  |  |         continue; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)) { | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |       if (Unsigned(LOCAL_tokptr->TokInfo) == ',' && prio >= 1000 && | 
					
						
							|  |  |  |           curprio <= 999) { | 
					
						
							|  |  |  |         Volatile Term args[2]; | 
					
						
							|  |  |  |         NextToken; | 
					
						
							|  |  |  |         args[0] = t; | 
					
						
							| 
									
										
										
										
											2015-12-15 08:38:56 +00:00
										 |  |  |         args[1] = ParseTerm(1000, FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         t = Yap_MkApplTerm(FunctorComma, 2, args); | 
					
						
							|  |  |  |         /* check for possible overflow against local stack */ | 
					
						
							|  |  |  |         if (HR > ASP - 4096) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |           syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |           FAIL; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         curprio = 1000; | 
					
						
							|  |  |  |         continue; | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       } else if (Unsigned(LOCAL_tokptr->TokInfo) == '|' && | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |                  IsInfixOp(AtomVBar, &opprio, &oplprio, &oprprio PASS_REGS) && | 
					
						
							|  |  |  |                  opprio <= prio && oplprio >= curprio) { | 
					
						
							|  |  |  |         Volatile Term args[2]; | 
					
						
							|  |  |  |         NextToken; | 
					
						
							|  |  |  |         args[0] = t; | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |         args[1] = ParseTerm(oprprio, FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         t = Yap_MkApplTerm(FunctorVBar, 2, args); | 
					
						
							|  |  |  |         /* check for possible overflow against local stack */ | 
					
						
							|  |  |  |         if (HR > ASP - 4096) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |           syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |           FAIL; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         curprio = opprio; | 
					
						
							|  |  |  |         continue; | 
					
						
							| 
									
										
										
										
											2013-07-07 16:15:25 -05:00
										 |  |  |       } else if (Unsigned(LOCAL_tokptr->TokInfo) == '(' && | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |                  IsPosfixOp(AtomEmptyBrackets, &opprio, &oplprio PASS_REGS) && | 
					
						
							|  |  |  |                  opprio <= prio && oplprio >= curprio) { | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |         t = ParseArgs(AtomEmptyBrackets, ')', FailBuff, t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         curprio = opprio; | 
					
						
							|  |  |  |         continue; | 
					
						
							|  |  |  |       } else if (Unsigned(LOCAL_tokptr->TokInfo) == '[' && | 
					
						
							|  |  |  |                  IsPosfixOp(AtomEmptySquareBrackets, &opprio, | 
					
						
							|  |  |  |                             &oplprio PASS_REGS) && | 
					
						
							|  |  |  |                  opprio <= prio && oplprio >= curprio) { | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |         t = ParseArgs(AtomEmptySquareBrackets, ']', FailBuff, t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         t = MakeAccessor(t, FunctorEmptySquareBrackets PASS_REGS); | 
					
						
							|  |  |  |         curprio = opprio; | 
					
						
							|  |  |  |         continue; | 
					
						
							| 
									
										
										
										
											2013-07-07 16:15:25 -05:00
										 |  |  |       } else if (Unsigned(LOCAL_tokptr->TokInfo) == '{' && | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |                  IsPosfixOp(AtomEmptyCurlyBrackets, &opprio, | 
					
						
							|  |  |  |                             &oplprio PASS_REGS) && | 
					
						
							|  |  |  |                  opprio <= prio && oplprio >= curprio) { | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |         t = ParseArgs(AtomEmptyCurlyBrackets, '}', FailBuff, t PASS_REGS); | 
					
						
							| 
									
										
										
										
											2015-02-10 00:03:02 +00:00
										 |  |  |         t = MakeAccessor(t, FunctorEmptyCurlyBrackets PASS_REGS); | 
					
						
							|  |  |  |         curprio = opprio; | 
					
						
							|  |  |  |         continue; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |     if (LOCAL_tokptr->Tok <= Ord(WString_tok)) { | 
					
						
							| 
									
										
										
										
											2016-02-11 06:00:56 -08:00
										 |  |  |       syntax_msg("line %d: expected operator, got \'%s\'",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       FAIL; | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     break; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-11-16 01:55:03 +00:00
										 |  |  |   return t; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  | Term Yap_Parse(UInt prio) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   Volatile Term t; | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |   JMPBUFF FailBuff; | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |   yhandle_t sls = Yap_StartSlots(); | 
					
						
							| 
									
										
										
										
											2015-09-21 17:05:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-16 01:22:10 +00:00
										 |  |  |   if (!sigsetjmp(FailBuff.JmpBuff, 0)) { | 
					
						
							| 
									
										
										
										
											2015-08-18 14:47:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |     t = ParseTerm(prio, &FailBuff PASS_REGS); | 
					
						
							| 
									
										
										
										
											2015-08-18 14:47:01 -05:00
										 |  |  | #if DEBUG
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     if (GLOBAL_Option['p' - 'a' + 1]) { | 
					
						
							|  |  |  |       Yap_DebugPutc(stderr, '['); | 
					
						
							|  |  |  |       if (t == 0) | 
					
						
							|  |  |  |         Yap_DebugPlWrite(MkIntTerm(0)); | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         Yap_DebugPlWrite(t); | 
					
						
							|  |  |  |       Yap_DebugPutc(stderr, ']'); | 
					
						
							|  |  |  |       Yap_DebugPutc(stderr, '\n'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-08-18 14:47:01 -05:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     Yap_CloseSlots(sls); | 
					
						
							|  |  |  |     if (LOCAL_tokptr != NULL && LOCAL_tokptr->Tok != Ord(eot_tok)) { | 
					
						
							| 
									
										
										
										
											2016-02-19 11:34:48 +00:00
										 |  |  |       LOCAL_Error_TYPE = SYNTAX_ERROR; | 
					
						
							|  |  |  |       LOCAL_ErrorMessage = "term does not end on . "; | 
					
						
							| 
									
										
										
										
											2015-08-18 14:47:01 -05:00
										 |  |  |       t = 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |     if (t != 0 && LOCAL_Error_TYPE == SYNTAX_ERROR) { | 
					
						
							| 
									
										
										
										
											2015-07-27 22:22:44 -05:00
										 |  |  |       LOCAL_Error_TYPE = YAP_NO_ERROR; | 
					
						
							|  |  |  |       LOCAL_ErrorMessage = NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-06-19 00:30:39 +01:00
										 |  |  |     //    if (LOCAL_tokptr->Tok != Ord(eot_tok))
 | 
					
						
							|  |  |  |     //  return (0L);
 | 
					
						
							| 
									
										
										
										
											2015-08-18 14:47:01 -05:00
										 |  |  |     return t; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-12-15 09:28:43 +00:00
										 |  |  |   Yap_CloseSlots(sls); | 
					
						
							| 
									
										
										
										
											2015-08-18 14:47:01 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return (0); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-09-15 13:10:49 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | //! @}
 |