*** empty log message ***
This commit is contained in:
@ -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>
|
||||
@ -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_charlit (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_comment (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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
xp_cint_t c;
|
||||
@ -174,16 +195,6 @@ static int __get_token (xp_stx_parser_t* parser)
|
||||
else if (xp_stx_isdigit(c)) {
|
||||
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('$')) {
|
||||
GET_CHAR (parser);
|
||||
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);
|
||||
GET_CHAR (parser);
|
||||
}
|
||||
else if (__is_binary_char(c)) {
|
||||
if (__get_binary(parser) == -1) return -1;
|
||||
}
|
||||
else {
|
||||
parser->error_code = XP_STX_PARSER_ERROR_CHAR;
|
||||
return -1;
|
||||
@ -345,6 +359,46 @@ static int __get_strlit (xp_stx_parser_t* parser)
|
||||
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)
|
||||
{
|
||||
while (xp_stx_isspace(parser->curc)) GET_CHAR (parser);
|
||||
|
Reference in New Issue
Block a user