2013-11-25 11:15:25 +00:00
|
|
|
|
|
|
|
typedef struct vlist_struct_t {
|
|
|
|
struct VARSTRUCT *ve;
|
|
|
|
struct vlist_struct_t *next;
|
|
|
|
} vlist_t;
|
|
|
|
|
|
|
|
typedef struct qq_struct_t {
|
|
|
|
unsigned char *text;
|
|
|
|
IOPOS start, mid, end;
|
|
|
|
vlist_t *vlist;
|
|
|
|
struct qq_struct_t *next;
|
|
|
|
} qq_t;
|
|
|
|
|
2013-11-18 12:57:09 +00:00
|
|
|
typedef unsigned char * ucharp;
|
|
|
|
typedef const unsigned char * cucharp;
|
|
|
|
|
|
|
|
#define utf8_get_uchar(s, chr) (ucharp)utf8_get_char((char *)(s), chr)
|
|
|
|
|
|
|
|
#define FASTBUFFERSIZE 256 /* read quickly upto this size */
|
|
|
|
|
|
|
|
struct read_buffer
|
|
|
|
{ int size; /* current size of read buffer */
|
|
|
|
unsigned char *base; /* base of read buffer */
|
|
|
|
unsigned char *here; /* current position in read buffer */
|
|
|
|
unsigned char *end; /* end of the valid buffer */
|
|
|
|
|
|
|
|
IOSTREAM *stream; /* stream we are reading from */
|
|
|
|
unsigned char fast[FASTBUFFERSIZE]; /* Quick internal buffer */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define RD_MAGIC 0xefebe128
|
|
|
|
|
|
|
|
typedef struct read_data_t
|
|
|
|
{ unsigned char *here; /* current character */
|
|
|
|
unsigned char *base; /* base of clause */
|
|
|
|
unsigned char *end; /* end of the clause */
|
|
|
|
unsigned char *token_start; /* start of most recent read token */
|
|
|
|
|
|
|
|
int magic; /* RD_MAGIC */
|
|
|
|
IOPOS position; /* Line, line pos, char and byte */
|
|
|
|
unsigned char *posp; /* position pointer */
|
|
|
|
size_t posi; /* position number */
|
|
|
|
|
|
|
|
term_t subtpos; /* Report Subterm positions */
|
|
|
|
bool cycles; /* Re-establish cycles */
|
|
|
|
source_location start_of_term; /* Position of start of term */
|
|
|
|
module_t module; /* Current source module */
|
|
|
|
unsigned int flags; /* Module syntax flags */
|
|
|
|
int styleCheck; /* style-checking mask */
|
|
|
|
bool backquoted_string; /* Read `hello` as string */
|
|
|
|
|
|
|
|
int *char_conversion_table; /* active conversion table */
|
|
|
|
|
|
|
|
atom_t on_error; /* Handling of syntax errors */
|
|
|
|
int has_exception; /* exception is raised */
|
|
|
|
|
|
|
|
term_t exception; /* raised exception */
|
|
|
|
term_t variables; /* report variables */
|
|
|
|
term_t singles; /* Report singleton variables */
|
|
|
|
term_t varnames; /* Report variables+names */
|
|
|
|
int strictness; /* Strictness level */
|
|
|
|
|
|
|
|
#ifdef O_QUASIQUOTATIONS
|
|
|
|
term_t quasi_quotations; /* User option quasi_quotations(QQ) */
|
|
|
|
term_t qq; /* Quasi quoted list */
|
|
|
|
term_t qq_tail; /* Tail of the quoted stuff */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
term_t comments; /* Report comments */
|
|
|
|
|
|
|
|
struct read_buffer _rb; /* keep read characters here */
|
|
|
|
} read_data, *ReadData;
|
|
|
|
|
|
|
|
#define rdhere (_PL_rd->here)
|
|
|
|
#define rdbase (_PL_rd->base)
|
|
|
|
#define rdend (_PL_rd->end)
|
|
|
|
#define last_token_start (_PL_rd->token_start)
|
|
|
|
#define rb (_PL_rd->_rb)
|
|
|
|
|
2014-09-10 05:51:44 +01:00
|
|
|
#define DO_CHARESCAPE True(_PL_rd, M_CHARESCAPE)
|
2013-11-18 12:57:09 +00:00
|
|
|
|
|
|
|
extern IOFUNCTIONS Sstringfunctions;
|
|
|
|
|
|
|
|
#ifndef NULL_ATOM
|
|
|
|
#define NULL_ATOM 0
|
|
|
|
#endif
|
|
|
|
|
2013-11-25 11:15:25 +00:00
|
|
|
static inline void
|
2013-11-18 12:57:09 +00:00
|
|
|
setCurrentSourceLocation(ReadData _PL_rd ARG_LD)
|
|
|
|
{ atom_t a;
|
|
|
|
IOSTREAM *s = rb.stream;
|
|
|
|
|
|
|
|
if ( (a = fileNameStream(s)) )
|
|
|
|
_PL_rd->start_of_term.file = a;
|
|
|
|
else
|
|
|
|
_PL_rd->start_of_term.file = NULL_ATOM;
|
|
|
|
|
|
|
|
if ( s->position )
|
|
|
|
{ _PL_rd->start_of_term.position.lineno = s->position->lineno;
|
|
|
|
_PL_rd->start_of_term.position.linepos = s->position->linepos - 1;
|
|
|
|
_PL_rd->start_of_term.position.charno = s->position->charno - 1;
|
|
|
|
/* byteno maintained get getchr__() */
|
|
|
|
} else
|
|
|
|
{ _PL_rd->start_of_term.position.lineno = -1;
|
|
|
|
_PL_rd->start_of_term.position.linepos = -1;
|
|
|
|
_PL_rd->start_of_term.position.charno = 0;
|
|
|
|
_PL_rd->start_of_term.position.byteno = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LD->read_source = _PL_rd->start_of_term;
|
|
|
|
}
|
|
|
|
|
|
|
|
extern int Yap_read_term(term_t t, IOSTREAM *st, struct read_data_t *rdt);
|
2013-11-25 11:15:25 +00:00
|
|
|
/* parser.c */
|
|
|
|
extern Term Yap_Parse( struct read_data_t *);
|
|
|
|
extern void init_read_data( struct read_data_t *, IOSTREAM *st ARG_LD);
|
|
|
|
extern void free_read_data( struct read_data_t *);
|
|
|
|
|