2005-02-04 15:39:11 +00:00
|
|
|
/*
|
2006-10-26 08:17:38 +00:00
|
|
|
* $Id: read.c,v 1.23 2006-10-26 08:17:38 bacon Exp $
|
2005-02-04 15:39:11 +00:00
|
|
|
*/
|
|
|
|
|
2006-10-25 13:42:31 +00:00
|
|
|
#include <ase/lsp/lsp_i.h>
|
2005-02-04 15:39:11 +00:00
|
|
|
|
|
|
|
#define IS_IDENT(c) \
|
2006-10-24 04:22:40 +00:00
|
|
|
((c) == ASE_T('+') || (c) == ASE_T('-') || \
|
|
|
|
(c) == ASE_T('*') || (c) == ASE_T('/') || \
|
|
|
|
(c) == ASE_T('%') || (c) == ASE_T('&') || \
|
|
|
|
(c) == ASE_T('<') || (c) == ASE_T('>') || \
|
|
|
|
(c) == ASE_T('=') || (c) == ASE_T('_') || \
|
|
|
|
(c) == ASE_T('?'))
|
|
|
|
|
2006-10-26 08:17:38 +00:00
|
|
|
#define TOKEN_CLEAR(lsp) ase_lsp_name_clear (&(lsp)->token.name)
|
2005-09-18 10:23:19 +00:00
|
|
|
#define TOKEN_TYPE(lsp) (lsp)->token.type
|
|
|
|
#define TOKEN_IVALUE(lsp) (lsp)->token.ivalue
|
2005-09-20 11:19:15 +00:00
|
|
|
#define TOKEN_RVALUE(lsp) (lsp)->token.rvalue
|
2006-10-26 08:17:38 +00:00
|
|
|
#define TOKEN_SVALUE(lsp) (lsp)->token.name.buf
|
2005-09-18 10:23:19 +00:00
|
|
|
#define TOKEN_SLENGTH(lsp) (lsp)->token.name.size
|
2005-11-18 17:58:47 +00:00
|
|
|
|
|
|
|
#define TOKEN_ADD_CHAR(lsp,ch) do { \
|
2006-10-26 08:17:38 +00:00
|
|
|
if (ase_lsp_name_addc(&(lsp)->token.name, ch) == -1) { \
|
2006-10-25 13:42:31 +00:00
|
|
|
lsp->errnum = ASE_LSP_ENOMEM; \
|
2005-11-18 17:58:47 +00:00
|
|
|
return -1; \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
2006-10-26 08:17:38 +00:00
|
|
|
#define TOKEN_COMPARE(lsp,str) ase_lsp_name_compare (&(lsp)->token.name, str)
|
2005-02-04 15:39:11 +00:00
|
|
|
|
|
|
|
#define TOKEN_END 0
|
|
|
|
#define TOKEN_INT 1
|
2005-09-20 11:19:15 +00:00
|
|
|
#define TOKEN_REAL 2
|
2005-02-04 15:39:11 +00:00
|
|
|
#define TOKEN_STRING 3
|
|
|
|
#define TOKEN_LPAREN 4
|
|
|
|
#define TOKEN_RPAREN 5
|
|
|
|
#define TOKEN_IDENT 6
|
|
|
|
#define TOKEN_QUOTE 7
|
|
|
|
#define TOKEN_DOT 8
|
|
|
|
#define TOKEN_INVALID 50
|
|
|
|
#define TOKEN_UNTERM_STRING 51
|
|
|
|
|
|
|
|
#define NEXT_CHAR(lsp) \
|
2005-09-18 13:06:43 +00:00
|
|
|
do { if (read_char(lsp) == -1) return -1;} while (0)
|
2005-02-04 15:39:11 +00:00
|
|
|
|
|
|
|
#define NEXT_TOKEN(lsp) \
|
2006-10-24 04:22:40 +00:00
|
|
|
do { if (read_token(lsp) == -1) return ASE_NULL; } while (0)
|
2005-02-04 15:39:11 +00:00
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
static ase_lsp_obj_t* read_obj (ase_lsp_t* lsp);
|
|
|
|
static ase_lsp_obj_t* read_list (ase_lsp_t* lsp);
|
|
|
|
static ase_lsp_obj_t* read_quote (ase_lsp_t* lsp);
|
2005-09-18 12:20:43 +00:00
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
static int read_char (ase_lsp_t* lsp);
|
|
|
|
static int read_token (ase_lsp_t* lsp);
|
|
|
|
static int read_number (ase_lsp_t* lsp, int negative);
|
|
|
|
static int read_ident (ase_lsp_t* lsp);
|
|
|
|
static int read_string (ase_lsp_t* lsp);
|
2005-09-18 12:20:43 +00:00
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
ase_lsp_obj_t* ase_lsp_read (ase_lsp_t* lsp)
|
2005-02-04 15:39:11 +00:00
|
|
|
{
|
2006-10-25 13:42:31 +00:00
|
|
|
if (lsp->curc == ASE_CHAR_EOF &&
|
2006-10-24 04:22:40 +00:00
|
|
|
read_char(lsp) == -1) return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
|
2006-10-25 13:42:31 +00:00
|
|
|
lsp->errnum = ASE_LSP_ENOERR;
|
2005-02-04 15:39:11 +00:00
|
|
|
NEXT_TOKEN (lsp);
|
|
|
|
|
2006-10-25 13:42:31 +00:00
|
|
|
if (lsp->mem->locked != ASE_NULL)
|
|
|
|
{
|
|
|
|
ase_lsp_unlockallobjs (lsp, lsp->mem->locked);
|
2006-10-24 04:22:40 +00:00
|
|
|
lsp->mem->locked = ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
|
|
|
lsp->mem->locked = read_obj (lsp);
|
|
|
|
return lsp->mem->locked;
|
|
|
|
}
|
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
static ase_lsp_obj_t* read_obj (ase_lsp_t* lsp)
|
2005-02-04 15:39:11 +00:00
|
|
|
{
|
2006-10-24 04:22:40 +00:00
|
|
|
ase_lsp_obj_t* obj;
|
2005-02-04 15:39:11 +00:00
|
|
|
|
2006-10-26 08:17:38 +00:00
|
|
|
switch (TOKEN_TYPE(lsp))
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
case TOKEN_END:
|
2006-10-24 04:22:40 +00:00
|
|
|
lsp->errnum = ASE_LSP_ERR_END;
|
|
|
|
return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
case TOKEN_LPAREN:
|
|
|
|
NEXT_TOKEN (lsp);
|
|
|
|
return read_list (lsp);
|
|
|
|
case TOKEN_QUOTE:
|
|
|
|
NEXT_TOKEN (lsp);
|
|
|
|
return read_quote (lsp);
|
|
|
|
case TOKEN_INT:
|
2006-10-25 13:42:31 +00:00
|
|
|
obj = ase_lsp_makeintobj (lsp->mem, TOKEN_IVALUE(lsp));
|
|
|
|
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ENOMEM;
|
|
|
|
ase_lsp_lockobj (lsp, obj);
|
2005-02-04 15:39:11 +00:00
|
|
|
return obj;
|
2005-09-20 11:19:15 +00:00
|
|
|
case TOKEN_REAL:
|
2006-10-25 13:42:31 +00:00
|
|
|
obj = ase_lsp_makerealobj (lsp->mem, TOKEN_RVALUE(lsp));
|
|
|
|
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ENOMEM;
|
|
|
|
ase_lsp_lockobj (lsp, obj);
|
2005-02-04 15:39:11 +00:00
|
|
|
return obj;
|
|
|
|
case TOKEN_STRING:
|
2006-10-25 13:42:31 +00:00
|
|
|
obj = ase_lsp_makestrobj (
|
2005-02-04 15:39:11 +00:00
|
|
|
lsp->mem, TOKEN_SVALUE(lsp), TOKEN_SLENGTH(lsp));
|
2006-10-25 13:42:31 +00:00
|
|
|
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ENOMEM;
|
|
|
|
ase_lsp_lockobj (lsp, obj);
|
2005-02-04 15:39:11 +00:00
|
|
|
return obj;
|
|
|
|
case TOKEN_IDENT:
|
2006-10-26 08:17:38 +00:00
|
|
|
ase_lsp_assert (lsp,
|
|
|
|
lsp->mem->nil != ASE_NULL && lsp->mem->t != ASE_NULL);
|
2006-10-24 04:22:40 +00:00
|
|
|
if (TOKEN_COMPARE(lsp,ASE_T("nil")) == 0) obj = lsp->mem->nil;
|
|
|
|
else if (TOKEN_COMPARE(lsp,ASE_T("t")) == 0) obj = lsp->mem->t;
|
2006-10-25 13:42:31 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
obj = ase_lsp_makesymobj (
|
2005-02-04 15:39:11 +00:00
|
|
|
lsp->mem, TOKEN_SVALUE(lsp), TOKEN_SLENGTH(lsp));
|
2006-10-25 13:42:31 +00:00
|
|
|
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ENOMEM;
|
|
|
|
ase_lsp_lockobj (lsp, obj);
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
lsp->errnum = ASE_LSP_ERR_SYNTAX;
|
|
|
|
return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
static ase_lsp_obj_t* read_list (ase_lsp_t* lsp)
|
2005-02-04 15:39:11 +00:00
|
|
|
{
|
2006-10-24 04:22:40 +00:00
|
|
|
ase_lsp_obj_t* obj;
|
|
|
|
ase_lsp_obj_cons_t* p, * first = ASE_NULL, * prev = ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
|
2006-10-26 08:17:38 +00:00
|
|
|
while (TOKEN_TYPE(lsp) != TOKEN_RPAREN)
|
|
|
|
{
|
|
|
|
if (TOKEN_TYPE(lsp) == TOKEN_END)
|
|
|
|
{
|
2006-10-24 04:22:40 +00:00
|
|
|
lsp->errnum = ASE_LSP_ERR_SYNTAX; // unexpected end of input
|
|
|
|
return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
|
|
|
|
2006-10-26 08:17:38 +00:00
|
|
|
if (TOKEN_TYPE(lsp) == TOKEN_DOT)
|
|
|
|
{
|
2006-10-24 04:22:40 +00:00
|
|
|
if (prev == ASE_NULL) {
|
|
|
|
lsp->errnum = ASE_LSP_ERR_SYNTAX; // unexpected .
|
|
|
|
return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NEXT_TOKEN (lsp);
|
|
|
|
obj = read_obj (lsp);
|
2006-10-26 08:17:38 +00:00
|
|
|
if (obj == ASE_NULL)
|
|
|
|
{
|
|
|
|
if (lsp->errnum == ASE_LSP_ERR_END)
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
//unexpected end of input
|
2006-10-24 04:22:40 +00:00
|
|
|
lsp->errnum = ASE_LSP_ERR_SYNTAX;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
2006-10-24 04:22:40 +00:00
|
|
|
return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
|
|
|
prev->cdr = obj;
|
|
|
|
|
|
|
|
NEXT_TOKEN (lsp);
|
2006-10-26 08:17:38 +00:00
|
|
|
if (TOKEN_TYPE(lsp) != TOKEN_RPAREN)
|
|
|
|
{
|
2006-10-24 04:22:40 +00:00
|
|
|
lsp->errnum = ASE_LSP_ERR_SYNTAX; // ) expected
|
|
|
|
return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
obj = read_obj (lsp);
|
2006-10-25 13:42:31 +00:00
|
|
|
if (obj == ASE_NULL)
|
|
|
|
{
|
|
|
|
if (lsp->errnum == ASE_LSP_ERR_END)
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
// unexpected end of input
|
2006-10-24 04:22:40 +00:00
|
|
|
lsp->errnum = ASE_LSP_ERR_SYNTAX;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
2006-10-24 04:22:40 +00:00
|
|
|
return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
|
|
|
|
2006-10-25 13:42:31 +00:00
|
|
|
p = (ase_lsp_obj_cons_t*)ase_lsp_makecons (
|
2005-02-04 15:39:11 +00:00
|
|
|
lsp->mem, lsp->mem->nil, lsp->mem->nil);
|
2006-10-25 13:42:31 +00:00
|
|
|
if (p == ASE_NULL)
|
|
|
|
{
|
|
|
|
lsp->errnum = ASE_LSP_ENOMEM;
|
2006-10-24 04:22:40 +00:00
|
|
|
return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
2006-10-25 13:42:31 +00:00
|
|
|
ase_lsp_lockobj (lsp, (ase_lsp_obj_t*)p);
|
2005-02-04 15:39:11 +00:00
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
if (first == ASE_NULL) first = p;
|
|
|
|
if (prev != ASE_NULL) prev->cdr = (ase_lsp_obj_t*)p;
|
2005-02-04 15:39:11 +00:00
|
|
|
|
|
|
|
p->car = obj;
|
|
|
|
prev = p;
|
|
|
|
|
|
|
|
NEXT_TOKEN (lsp);
|
|
|
|
}
|
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
return (first == ASE_NULL)? lsp->mem->nil: (ase_lsp_obj_t*)first;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
static ase_lsp_obj_t* read_quote (ase_lsp_t* lsp)
|
2005-02-04 15:39:11 +00:00
|
|
|
{
|
2006-10-24 04:22:40 +00:00
|
|
|
ase_lsp_obj_t* cons, * tmp;
|
2005-02-04 15:39:11 +00:00
|
|
|
|
|
|
|
tmp = read_obj (lsp);
|
2006-10-25 13:42:31 +00:00
|
|
|
if (tmp == ASE_NULL)
|
|
|
|
{
|
|
|
|
if (lsp->errnum == ASE_LSP_ERR_END)
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
// unexpected end of input
|
2006-10-24 04:22:40 +00:00
|
|
|
lsp->errnum = ASE_LSP_ERR_SYNTAX;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
2006-10-24 04:22:40 +00:00
|
|
|
return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
|
|
|
|
2006-10-25 13:42:31 +00:00
|
|
|
cons = ase_lsp_makecons (lsp->mem, tmp, lsp->mem->nil);
|
|
|
|
if (cons == ASE_NULL)
|
|
|
|
{
|
|
|
|
lsp->errnum = ASE_LSP_ENOMEM;
|
2006-10-24 04:22:40 +00:00
|
|
|
return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
2006-10-25 13:42:31 +00:00
|
|
|
ase_lsp_lockobj (lsp, cons);
|
2005-02-04 15:39:11 +00:00
|
|
|
|
2006-10-25 13:42:31 +00:00
|
|
|
cons = ase_lsp_makecons (lsp->mem, lsp->mem->quote, cons);
|
|
|
|
if (cons == ASE_NULL)
|
|
|
|
{
|
|
|
|
lsp->errnum = ASE_LSP_ENOMEM;
|
2006-10-24 04:22:40 +00:00
|
|
|
return ASE_NULL;
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
2006-10-25 13:42:31 +00:00
|
|
|
ase_lsp_lockobj (lsp, cons);
|
2005-02-04 15:39:11 +00:00
|
|
|
|
|
|
|
return cons;
|
|
|
|
}
|
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
static int read_char (ase_lsp_t* lsp)
|
2005-09-18 13:06:43 +00:00
|
|
|
{
|
2006-10-24 04:22:40 +00:00
|
|
|
ase_ssize_t n;
|
2005-09-18 13:06:43 +00:00
|
|
|
|
2006-10-25 13:42:31 +00:00
|
|
|
if (lsp->input_func == ASE_NULL)
|
|
|
|
{
|
2006-10-24 04:22:40 +00:00
|
|
|
lsp->errnum = ASE_LSP_ERR_INPUT_NOT_ATTACHED;
|
2005-09-18 13:06:43 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2006-10-26 08:17:38 +00:00
|
|
|
n = lsp->input_func(ASE_LSP_IO_READ, lsp->input_arg, &lsp->curc, 1);
|
2006-10-25 13:42:31 +00:00
|
|
|
if (n == -1)
|
|
|
|
{
|
2006-10-24 04:22:40 +00:00
|
|
|
lsp->errnum = ASE_LSP_ERR_INPUT;
|
2005-09-18 13:06:43 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2006-10-25 13:42:31 +00:00
|
|
|
if (n == 0) lsp->curc = ASE_CHAR_EOF;
|
2005-09-18 13:06:43 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
static int read_token (ase_lsp_t* lsp)
|
2005-02-04 15:39:11 +00:00
|
|
|
{
|
2006-10-26 08:17:38 +00:00
|
|
|
ase_lsp_assert (lsp, lsp->input_func != ASE_NULL);
|
2005-02-04 15:39:11 +00:00
|
|
|
|
|
|
|
TOKEN_CLEAR (lsp);
|
|
|
|
|
2006-10-25 13:42:31 +00:00
|
|
|
while (1)
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
// skip white spaces
|
2006-10-26 08:17:38 +00:00
|
|
|
while (ASE_LSP_ISSPACE(lsp, lsp->curc)) NEXT_CHAR (lsp);
|
2005-02-04 15:39:11 +00:00
|
|
|
|
|
|
|
// skip the comments here
|
2006-10-25 13:42:31 +00:00
|
|
|
if (lsp->curc == ASE_T(';'))
|
|
|
|
{
|
|
|
|
do
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
NEXT_CHAR (lsp);
|
2006-10-25 13:42:31 +00:00
|
|
|
}
|
2006-10-26 08:17:38 +00:00
|
|
|
while (lsp->curc != ASE_T('\n') &&
|
|
|
|
lsp->curc != ASE_CHAR_EOF);
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
|
|
|
else break;
|
|
|
|
}
|
|
|
|
|
2006-10-25 13:42:31 +00:00
|
|
|
if (lsp->curc == ASE_CHAR_EOF)
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
TOKEN_TYPE(lsp) = TOKEN_END;
|
|
|
|
return 0;
|
|
|
|
}
|
2006-10-25 13:42:31 +00:00
|
|
|
else if (lsp->curc == ASE_T('('))
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
TOKEN_ADD_CHAR (lsp, lsp->curc);
|
|
|
|
TOKEN_TYPE(lsp) = TOKEN_LPAREN;
|
|
|
|
NEXT_CHAR (lsp);
|
|
|
|
return 0;
|
|
|
|
}
|
2006-10-25 13:42:31 +00:00
|
|
|
else if (lsp->curc == ASE_T(')'))
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
TOKEN_ADD_CHAR (lsp, lsp->curc);
|
|
|
|
TOKEN_TYPE(lsp) = TOKEN_RPAREN;
|
|
|
|
NEXT_CHAR (lsp);
|
|
|
|
return 0;
|
|
|
|
}
|
2006-10-25 13:42:31 +00:00
|
|
|
else if (lsp->curc == ASE_T('\''))
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
TOKEN_ADD_CHAR (lsp, lsp->curc);
|
|
|
|
TOKEN_TYPE(lsp) = TOKEN_QUOTE;
|
|
|
|
NEXT_CHAR (lsp);
|
|
|
|
return 0;
|
|
|
|
}
|
2006-10-25 13:42:31 +00:00
|
|
|
else if (lsp->curc == ASE_T('.'))
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
TOKEN_ADD_CHAR (lsp, lsp->curc);
|
|
|
|
TOKEN_TYPE(lsp) = TOKEN_DOT;
|
|
|
|
NEXT_CHAR (lsp);
|
|
|
|
return 0;
|
|
|
|
}
|
2006-10-25 13:42:31 +00:00
|
|
|
else if (lsp->curc == ASE_T('-'))
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
TOKEN_ADD_CHAR (lsp, lsp->curc);
|
|
|
|
NEXT_CHAR (lsp);
|
2006-10-26 08:17:38 +00:00
|
|
|
if (ASE_LSP_ISDIGIT(lsp,lsp->curc))
|
2006-10-25 13:42:31 +00:00
|
|
|
{
|
2005-09-20 08:05:32 +00:00
|
|
|
return read_number (lsp, 1);
|
|
|
|
}
|
2006-10-25 13:42:31 +00:00
|
|
|
else if (IS_IDENT(lsp->curc))
|
|
|
|
{
|
2005-09-20 08:05:32 +00:00
|
|
|
return read_ident (lsp);
|
|
|
|
}
|
2006-10-25 13:42:31 +00:00
|
|
|
else
|
|
|
|
{
|
2005-09-20 08:05:32 +00:00
|
|
|
TOKEN_TYPE(lsp) = TOKEN_IDENT;
|
|
|
|
return 0;
|
|
|
|
}
|
2005-02-04 15:39:11 +00:00
|
|
|
}
|
2006-10-26 08:17:38 +00:00
|
|
|
else if (ASE_LSP_ISDIGIT(lsp,lsp->curc))
|
2006-10-25 13:42:31 +00:00
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
return read_number (lsp, 0);
|
|
|
|
}
|
2006-10-26 08:17:38 +00:00
|
|
|
else if (ASE_LSP_ISALPHA(lsp,lsp->curc) || IS_IDENT(lsp->curc))
|
2006-10-25 13:42:31 +00:00
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
return read_ident (lsp);
|
|
|
|
}
|
2006-10-25 13:42:31 +00:00
|
|
|
else if (lsp->curc == ASE_T('\"'))
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
NEXT_CHAR (lsp);
|
|
|
|
return read_string (lsp);
|
|
|
|
}
|
|
|
|
|
|
|
|
TOKEN_TYPE(lsp) = TOKEN_INVALID;
|
|
|
|
NEXT_CHAR (lsp); // consume
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
static int read_number (ase_lsp_t* lsp, int negative)
|
2005-02-04 15:39:11 +00:00
|
|
|
{
|
2006-10-25 13:42:31 +00:00
|
|
|
ase_long_t ivalue = 0;
|
|
|
|
ase_real_t rvalue = 0.;
|
2005-02-14 14:37:50 +00:00
|
|
|
|
2006-10-25 13:42:31 +00:00
|
|
|
do
|
|
|
|
{
|
2006-10-24 04:22:40 +00:00
|
|
|
ivalue = ivalue * 10 + (lsp->curc - ASE_T('0'));
|
2005-02-04 15:39:11 +00:00
|
|
|
TOKEN_ADD_CHAR (lsp, lsp->curc);
|
|
|
|
NEXT_CHAR (lsp);
|
2006-10-25 13:42:31 +00:00
|
|
|
}
|
2006-10-26 08:17:38 +00:00
|
|
|
while (ASE_LSP_ISDIGIT(lsp,lsp->curc));
|
2005-02-04 15:39:11 +00:00
|
|
|
|
2005-09-20 11:19:15 +00:00
|
|
|
/* TODO: extend parsing floating point number */
|
2006-10-25 13:42:31 +00:00
|
|
|
if (lsp->curc == ASE_T('.'))
|
|
|
|
{
|
|
|
|
ase_real_t fraction = 0.1;
|
2005-02-14 14:37:50 +00:00
|
|
|
|
2005-09-20 11:19:15 +00:00
|
|
|
NEXT_CHAR (lsp);
|
2006-10-25 13:42:31 +00:00
|
|
|
rvalue = (ase_real_t)ivalue;
|
2005-09-20 11:19:15 +00:00
|
|
|
|
2006-10-26 08:17:38 +00:00
|
|
|
while (ASE_LSP_ISDIGIT(lsp, lsp->curc))
|
2006-10-25 13:42:31 +00:00
|
|
|
{
|
|
|
|
rvalue += (ase_real_t)(lsp->curc - ASE_T('0')) * fraction;
|
2005-09-20 11:19:15 +00:00
|
|
|
fraction *= 0.1;
|
|
|
|
NEXT_CHAR (lsp);
|
|
|
|
}
|
2005-02-04 15:39:11 +00:00
|
|
|
|
2005-09-20 11:19:15 +00:00
|
|
|
TOKEN_RVALUE(lsp) = rvalue;
|
|
|
|
TOKEN_TYPE(lsp) = TOKEN_REAL;
|
|
|
|
if (negative) rvalue *= -1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
TOKEN_IVALUE(lsp) = ivalue;
|
|
|
|
TOKEN_TYPE(lsp) = TOKEN_INT;
|
|
|
|
if (negative) ivalue *= -1;
|
|
|
|
}
|
2005-02-04 15:39:11 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
static int read_ident (ase_lsp_t* lsp)
|
2005-02-04 15:39:11 +00:00
|
|
|
{
|
2006-10-26 08:17:38 +00:00
|
|
|
do
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
TOKEN_ADD_CHAR (lsp, lsp->curc);
|
|
|
|
NEXT_CHAR (lsp);
|
2006-10-26 08:17:38 +00:00
|
|
|
}
|
|
|
|
while (ASE_LSP_ISALNUM(lsp,lsp->curc) || IS_IDENT(lsp->curc));
|
2005-02-04 15:39:11 +00:00
|
|
|
TOKEN_TYPE(lsp) = TOKEN_IDENT;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-10-24 04:22:40 +00:00
|
|
|
static int read_string (ase_lsp_t* lsp)
|
2005-02-04 15:39:11 +00:00
|
|
|
{
|
|
|
|
int escaped = 0;
|
2006-10-24 04:22:40 +00:00
|
|
|
ase_cint_t code = 0;
|
2005-02-04 15:39:11 +00:00
|
|
|
|
2006-10-26 08:17:38 +00:00
|
|
|
do
|
|
|
|
{
|
|
|
|
if (lsp->curc == ASE_CHAR_EOF)
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
TOKEN_TYPE(lsp) = TOKEN_UNTERM_STRING;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO:
|
2006-10-26 08:17:38 +00:00
|
|
|
if (escaped == 3)
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
/* \xNN */
|
|
|
|
}
|
2006-10-26 08:17:38 +00:00
|
|
|
else if (escaped == 2)
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
/* \000 */
|
|
|
|
}
|
2006-10-26 08:17:38 +00:00
|
|
|
else if (escaped == 1)
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
/* backslash + character */
|
2006-10-24 04:22:40 +00:00
|
|
|
if (lsp->curc == ASE_T('a'))
|
|
|
|
lsp->curc = ASE_T('\a');
|
|
|
|
else if (lsp->curc == ASE_T('b'))
|
|
|
|
lsp->curc = ASE_T('\b');
|
|
|
|
else if (lsp->curc == ASE_T('f'))
|
|
|
|
lsp->curc = ASE_T('\f');
|
|
|
|
else if (lsp->curc == ASE_T('n'))
|
|
|
|
lsp->curc = ASE_T('\n');
|
|
|
|
else if (lsp->curc == ASE_T('r'))
|
|
|
|
lsp->curc = ASE_T('\r');
|
|
|
|
else if (lsp->curc == ASE_T('t'))
|
|
|
|
lsp->curc = ASE_T('\t');
|
|
|
|
else if (lsp->curc == ASE_T('v'))
|
|
|
|
lsp->curc = ASE_T('\v');
|
2006-10-26 08:17:38 +00:00
|
|
|
else if (lsp->curc == ASE_T('0'))
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
escaped = 2;
|
|
|
|
code = 0;
|
|
|
|
NEXT_CHAR (lsp);
|
|
|
|
continue;
|
|
|
|
}
|
2006-10-26 08:17:38 +00:00
|
|
|
else if (lsp->curc == ASE_T('x'))
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
escaped = 3;
|
|
|
|
code = 0;
|
|
|
|
NEXT_CHAR (lsp);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
2006-10-26 08:17:38 +00:00
|
|
|
else if (lsp->curc == ASE_T('\\'))
|
|
|
|
{
|
2005-02-04 15:39:11 +00:00
|
|
|
escaped = 1;
|
|
|
|
NEXT_CHAR (lsp);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
TOKEN_ADD_CHAR (lsp, lsp->curc);
|
|
|
|
NEXT_CHAR (lsp);
|
2006-10-26 08:17:38 +00:00
|
|
|
}
|
|
|
|
while (lsp->curc != ASE_T('\"'));
|
2005-02-04 15:39:11 +00:00
|
|
|
|
|
|
|
TOKEN_TYPE(lsp) = TOKEN_STRING;
|
|
|
|
NEXT_CHAR (lsp);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|