*** empty log message ***

This commit is contained in:
hyung-hwan 2005-06-08 15:49:35 +00:00
parent 785370660b
commit ed2f88e00d
4 changed files with 96 additions and 41 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: parser.c,v 1.22 2005-06-08 03:19:31 bacon Exp $ * $Id: parser.c,v 1.23 2005-06-08 15:49:35 bacon Exp $
*/ */
#include <xp/stx/parser.h> #include <xp/stx/parser.h>
@ -18,6 +18,7 @@ static int __get_ident (xp_stx_parser_t* parser);
static int __get_numlit (xp_stx_parser_t* parser, xp_bool_t negated); static int __get_numlit (xp_stx_parser_t* parser, xp_bool_t negated);
static int __get_charlit (xp_stx_parser_t* parser); static int __get_charlit (xp_stx_parser_t* parser);
static int __get_strlit (xp_stx_parser_t* parser); static int __get_strlit (xp_stx_parser_t* parser);
static int __get_binary (xp_stx_parser_t* parser);
static int __skip_spaces (xp_stx_parser_t* parser); static int __skip_spaces (xp_stx_parser_t* parser);
static int __skip_comment (xp_stx_parser_t* parser); static int __skip_comment (xp_stx_parser_t* parser);
static int __get_char (xp_stx_parser_t* parser); static int __get_char (xp_stx_parser_t* parser);
@ -149,6 +150,26 @@ static int __parse_statements (xp_stx_parser_t* parser)
return -1; return -1;
} }
static inline xp_bool_t __is_binary_char (xp_cint_t c)
{
/*
* binaryCharacter ::=
* '!' | '%' | '&' | '*' | '+' | ',' |
* '/' | '<' | '=' | '>' | '?' | '@' |
* '\' | '~' | '|' | '-'
*/
return
c == XP_STX_CHAR('!') || c == XP_STX_CHAR('%') ||
c == XP_STX_CHAR('&') || c == XP_STX_CHAR('*') ||
c == XP_STX_CHAR('+') || c == XP_STX_CHAR(',') ||
c == XP_STX_CHAR('/') || c == XP_STX_CHAR('<') ||
c == XP_STX_CHAR('=') || c == XP_STX_CHAR('>') ||
c == XP_STX_CHAR('?') || c == XP_STX_CHAR('@') ||
c == XP_STX_CHAR('\\') || c == XP_STX_CHAR('|') ||
c == XP_STX_CHAR('~') || c == XP_STX_CHAR('-');
}
static int __get_token (xp_stx_parser_t* parser) static int __get_token (xp_stx_parser_t* parser)
{ {
xp_cint_t c; xp_cint_t c;
@ -174,16 +195,6 @@ static int __get_token (xp_stx_parser_t* parser)
else if (xp_stx_isdigit(c)) { else if (xp_stx_isdigit(c)) {
if (__get_numlit(parser, xp_false) == -1) return -1; if (__get_numlit(parser, xp_false) == -1) return -1;
} }
else if (c == XP_STX_CHAR('-')) {
parser->token.type = XP_STX_TOKEN_MINUS;
ADD_TOKEN_CHAR(parser, c);
GET_CHAR (parser);
c = parser->curc;
if (xp_stx_isdigit(c)) {
if (__get_numlit(parser,xp_true) == -1) return -1;
}
}
else if (c == XP_STX_CHAR('$')) { else if (c == XP_STX_CHAR('$')) {
GET_CHAR (parser); GET_CHAR (parser);
if (__get_charlit(parser) == -1) return -1; if (__get_charlit(parser) == -1) return -1;
@ -229,6 +240,9 @@ static int __get_token (xp_stx_parser_t* parser)
ADD_TOKEN_CHAR(parser, c); ADD_TOKEN_CHAR(parser, c);
GET_CHAR (parser); GET_CHAR (parser);
} }
else if (__is_binary_char(c)) {
if (__get_binary(parser) == -1) return -1;
}
else { else {
parser->error_code = XP_STX_PARSER_ERROR_CHAR; parser->error_code = XP_STX_PARSER_ERROR_CHAR;
return -1; return -1;
@ -345,6 +359,46 @@ static int __get_strlit (xp_stx_parser_t* parser)
return 0; return 0;
} }
static int __get_binary (xp_stx_parser_t* parser)
{
/*
* binarySelector ::= binaryCharacter+
*/
xp_cint_t c = parser->curc;
ADD_TOKEN_CHAR (parser, c);
if (c == XP_STX_CHAR('<')) {
/*
const xp_stx_char_t* p = XP_TEXT("primitive:");
do {
GET_CHAR (parser);
c = parser->curc;
if (c == 'p') return __get_primitive (parser);
} while (*c)
*/
}
else if (c == XP_STX_CHAR('-')) {
GET_CHAR (parser);
c = parser->curc;
if (xp_stx_isdigit(c)) return __get_numlit(parser,xp_true);
}
else {
GET_CHAR (parser);
c = parser->curc;
}
if (__is_binary_char(c)) {
ADD_TOKEN_CHAR (parser, c);
GET_CHAR (parser);
}
parser->token.type = XP_STX_TOKEN_BINARY;
return 0;
}
static int __skip_spaces (xp_stx_parser_t* parser) static int __skip_spaces (xp_stx_parser_t* parser)
{ {
while (xp_stx_isspace(parser->curc)) GET_CHAR (parser); while (xp_stx_isspace(parser->curc)) GET_CHAR (parser);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: stx.h,v 1.24 2005-06-05 05:26:24 bacon Exp $ * $Id: stx.h,v 1.25 2005-06-08 15:49:35 bacon Exp $
*/ */
#ifndef _XP_STX_STX_H_ #ifndef _XP_STX_STX_H_
@ -8,10 +8,10 @@
#include <xp/types.h> #include <xp/types.h>
#include <xp/macros.h> #include <xp/macros.h>
typedef xp_byte_t xp_stx_byte_t; typedef xp_byte_t xp_byte_t;
typedef xp_char_t xp_stx_char_t; typedef xp_char_t xp_char_t;
typedef xp_cint_t xp_stx_cint_t; typedef xp_cint_t xp_stx_cint_t;
typedef xp_size_t xp_stx_word_t; typedef xp_word_t xp_word_t;
typedef struct xp_stx_objhdr_t xp_stx_objhdr_t; typedef struct xp_stx_objhdr_t xp_stx_objhdr_t;
typedef struct xp_stx_object_t xp_stx_object_t; typedef struct xp_stx_object_t xp_stx_object_t;
@ -31,8 +31,8 @@ struct xp_stx_objhdr_t
/* access - type: 2; size: rest; /* access - type: 2; size: rest;
* type - word indexed: 00 byte indexed: 01 char indexed: 10 * type - word indexed: 00 byte indexed: 01 char indexed: 10
*/ */
xp_stx_word_t access; xp_word_t access;
xp_stx_word_t class; xp_word_t class;
}; };
struct xp_stx_object_t struct xp_stx_object_t
@ -43,24 +43,24 @@ struct xp_stx_object_t
struct xp_stx_word_object_t struct xp_stx_word_object_t
{ {
xp_stx_objhdr_t header; xp_stx_objhdr_t header;
xp_stx_word_t data[1]; xp_word_t data[1];
}; };
struct xp_stx_byte_object_t struct xp_stx_byte_object_t
{ {
xp_stx_objhdr_t header; xp_stx_objhdr_t header;
xp_stx_byte_t data[1]; xp_byte_t data[1];
}; };
struct xp_stx_char_object_t struct xp_stx_char_object_t
{ {
xp_stx_objhdr_t header; xp_stx_objhdr_t header;
xp_stx_char_t data[1]; xp_char_t data[1];
}; };
struct xp_stx_memory_t struct xp_stx_memory_t
{ {
xp_stx_word_t capacity; xp_word_t capacity;
xp_stx_object_t** slots; xp_stx_object_t** slots;
xp_stx_object_t** free; xp_stx_object_t** free;
xp_bool_t __malloced; xp_bool_t __malloced;
@ -70,21 +70,21 @@ struct xp_stx_t
{ {
xp_stx_memory_t memory; xp_stx_memory_t memory;
xp_stx_word_t nil; xp_word_t nil;
xp_stx_word_t true; xp_word_t true;
xp_stx_word_t false; xp_word_t false;
xp_stx_word_t symbol_table; xp_word_t symbol_table;
xp_stx_word_t smalltalk; xp_word_t smalltalk;
xp_stx_word_t class_symlink; xp_word_t class_symlink;
xp_stx_word_t class_symbol; xp_word_t class_symbol;
xp_stx_word_t class_metaclass; xp_word_t class_metaclass;
xp_stx_word_t class_pairlink; xp_word_t class_pairlink;
xp_stx_word_t class_object; xp_word_t class_object;
xp_stx_word_t class_class; xp_word_t class_class;
xp_stx_word_t class_array; xp_word_t class_array;
xp_bool_t __malloced; xp_bool_t __malloced;
xp_bool_t __wantabort; /* TODO: make it a function pointer */ xp_bool_t __wantabort; /* TODO: make it a function pointer */
@ -115,17 +115,17 @@ typedef xp_stx_cint_t (*xp_stx_getc_t) (void*);
((xp_stx_char_object_t*)XP_STX_OBJECT(stx,idx)) ((xp_stx_char_object_t*)XP_STX_OBJECT(stx,idx))
#define XP_STX_WORDAT(stx,idx,n) \ #define XP_STX_WORDAT(stx,idx,n) \
(((xp_stx_word_t*)(XP_STX_OBJECT(stx,idx) + 1))[n]) (((xp_word_t*)(XP_STX_OBJECT(stx,idx) + 1))[n])
#define XP_STX_BYTEAT(stx,idx,n) \ #define XP_STX_BYTEAT(stx,idx,n) \
(((xp_stx_byte_t*)(XP_STX_OBJECT(stx,idx) + 1))[n]) (((xp_byte_t*)(XP_STX_OBJECT(stx,idx) + 1))[n])
#define XP_STX_CHARAT(stx,idx,n) \ #define XP_STX_CHARAT(stx,idx,n) \
(((xp_stx_char_t*)(XP_STX_OBJECT(stx,idx) + 1))[n]) (((xp_char_t*)(XP_STX_OBJECT(stx,idx) + 1))[n])
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
xp_stx_t* xp_stx_open (xp_stx_t* stx, xp_stx_word_t capacity); xp_stx_t* xp_stx_open (xp_stx_t* stx, xp_word_t capacity);
void xp_stx_close (xp_stx_t* stx); void xp_stx_close (xp_stx_t* stx);
int xp_stx_bootstrap (xp_stx_t* stx); int xp_stx_bootstrap (xp_stx_t* stx);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: token.h,v 1.7 2005-06-08 03:16:34 bacon Exp $ * $Id: token.h,v 1.8 2005-06-08 15:49:35 bacon Exp $
*/ */
#ifndef _XP_STX_TOKEN_H_ #ifndef _XP_STX_TOKEN_H_
@ -16,14 +16,14 @@ enum
XP_STX_TOKEN_IDENT, XP_STX_TOKEN_IDENT,
XP_STX_TOKEN_BINARY, XP_STX_TOKEN_BINARY,
XP_STX_TOKEN_KEYWORD, XP_STX_TOKEN_KEYWORD,
XP_STX_TOKEN_MINUS, XP_STX_TOKEN_PRIMITIVE,
XP_STX_TOKEN_ASSIGN, XP_STX_TOKEN_ASSIGN,
XP_STX_TOKEN_COLON, XP_STX_TOKEN_COLON,
XP_STX_TOKEN_RETURN, XP_STX_TOKEN_RETURN,
XP_STX_TOKEN_BAR, XP_STX_TOKEN_BAR,
XP_STX_TOKEN_LBRACKET, XP_STX_TOKEN_LBRACKET,
XP_STX_TOKEN_RBRACKET, XP_STX_TOKEN_RBRACKET,
XP_STX_TOKEN_PERIOD, XP_STX_TOKEN_PERIOD
}; };
struct xp_stx_token_t struct xp_stx_token_t

View File

@ -1,5 +1,5 @@
/* /*
* $Id: types.h,v 1.27 2005-06-06 16:32:29 bacon Exp $ * $Id: types.h,v 1.28 2005-06-08 15:49:35 bacon Exp $
*/ */
#ifndef _XP_TYPES_H_ #ifndef _XP_TYPES_H_
@ -116,6 +116,7 @@ typedef int xp_tri_t;
typedef xp_uint8_t xp_byte_t; typedef xp_uint8_t xp_byte_t;
typedef xp_uint_t xp_size_t; typedef xp_uint_t xp_size_t;
typedef xp_int_t xp_ssize_t; typedef xp_int_t xp_ssize_t;
typedef xp_uint_t xp_word_t;
/* floating-point number */ /* floating-point number */
#if SIZEOF_LONG_DOUBLE > SIZEOF_DOUBLE #if SIZEOF_LONG_DOUBLE > SIZEOF_DOUBLE