From 4f260eb1b784d555590327c7812567b9fbf1361e Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 4 Jul 2005 10:02:00 +0000 Subject: [PATCH] *** empty log message *** --- ase/stx/parser.c | 67 ++++++++++++++++++++++++++++++++++++++++---- ase/stx/parser.h | 7 ++++- ase/test/stx/test.st | 1 + 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/ase/stx/parser.c b/ase/stx/parser.c index 5cc77cb5..6bc9c00a 100644 --- a/ase/stx/parser.c +++ b/ase/stx/parser.c @@ -1,5 +1,5 @@ /* - * $Id: parser.c,v 1.47 2005-07-04 04:31:32 bacon Exp $ + * $Id: parser.c,v 1.48 2005-07-04 10:02:00 bacon Exp $ */ #include @@ -16,6 +16,7 @@ static int __parse_binary_pattern (xp_stx_parser_t* parser); static int __parse_keyword_pattern (xp_stx_parser_t* parser); static int __parse_temporaries (xp_stx_parser_t* parser); +static int __parse_primitive (xp_stx_parser_t* parser); static int __parse_statements (xp_stx_parser_t* parser); static int __parse_block_statements (xp_stx_parser_t* parser); static int __parse_statement (xp_stx_parser_t* parser); @@ -144,6 +145,11 @@ const xp_char_t* xp_stx_parser_error_string (xp_stx_parser_t* parser) XP_TEXT("message selector"), XP_TEXT("invalid argument name"), XP_TEXT("too many arguments"), + + XP_TEXT("invalid primitive type"), + XP_TEXT("primitive number expected"), + XP_TEXT("primitive not closed"), + XP_TEXT("temporary list not closed"), XP_TEXT("too many temporaries"), XP_TEXT("cannot redefine pseudo variable"), @@ -182,6 +188,22 @@ static INLINE xp_bool_t __is_vbar_token (const xp_stx_token_t* token) token->name.buffer[0] == XP_CHAR('|'); } +static INLINE xp_bool_t __is_primitive_opener (const xp_stx_token_t* token) +{ + return + token->type == XP_STX_TOKEN_BINARY && + token->name.size == 1 && + token->name.buffer[0] == XP_CHAR('<'); +} + +static INLINE xp_bool_t __is_primitive_closer (const xp_stx_token_t* token) +{ + return + token->type == XP_STX_TOKEN_BINARY && + token->name.size == 1 && + token->name.buffer[0] == XP_CHAR('>'); +} + static INLINE xp_bool_t __is_binary_char (xp_cint_t c) { /* @@ -233,7 +255,7 @@ static int __parse_method ( { /* * ::= - * [ ] [] + * [] [] [] */ GET_CHAR (parser); @@ -250,6 +272,7 @@ static int __parse_method ( if (__parse_message_pattern(parser) == -1) return -1; if (__parse_temporaries(parser) == -1) return -1; + if (__parse_primitive(parser) == -1) return -1; if (__parse_statements(parser) == -1) return -1; return 0; @@ -417,6 +440,38 @@ static int __parse_temporaries (xp_stx_parser_t* parser) return 0; } +static int __parse_primitive (xp_stx_parser_t* parser) +{ + /* + * ::= '<' 'primitive:' number '>' + */ + + if (!__is_primitive_opener(&parser->token)) return 0; + GET_TOKEN (parser); + + if (parser->token.type != XP_STX_TOKEN_KEYWORD || + xp_strcmp (parser->token.name.buffer, XP_TEXT("primitive:")) != 0) { + parser->error_code = XP_STX_PARSER_ERROR_PRIMITIVE_KEYWORD; + return -1; + } + + GET_TOKEN (parser); /* TODO: only integer */ + if (parser->token.type != XP_STX_TOKEN_NUMLIT) { + parser->error_code = XP_STX_PARSER_ERROR_PRIMITIVE_NUMBER; + return -1; + } +EMIT_CODE (parser, XP_TEXT("DO_PRIMITIVE"), parser->token.name.buffer); + + GET_TOKEN (parser); + if (!__is_primitive_closer(&parser->token)) { + parser->error_code = XP_STX_PARSER_ERROR_PRIMITIVE_NOT_CLOSED; + return -1; + } + + GET_TOKEN (parser); + return 0; +} + static int __parse_statements (xp_stx_parser_t* parser) { /* @@ -519,7 +574,8 @@ static int __parse_expression (xp_stx_parser_t* parser) return 0; } -static int __parse_basic_expression (xp_stx_parser_t* parser, const xp_char_t* ident) +static int __parse_basic_expression ( + xp_stx_parser_t* parser, const xp_char_t* ident) { /* * ::= [ ] @@ -568,7 +624,9 @@ xp_sprintf (buf, xp_countof(buf), XP_TEXT("%d"), i); return 0; } - /* TODO: global, but i don't like this idea */ + /* TODO: IMPLEMENT POOL DICTIONARIES */ + + /* TODO: IMPLEMENT GLOBLAS, but i don't like this idea */ parser->error_code = XP_STX_PARSER_ERROR_UNDECLARED_NAME; return -1; @@ -796,7 +854,6 @@ static int __emit_code ( return 0; } - static int __get_token (xp_stx_parser_t* parser) { xp_cint_t c; diff --git a/ase/stx/parser.h b/ase/stx/parser.h index e58ff118..5e499f85 100644 --- a/ase/stx/parser.h +++ b/ase/stx/parser.h @@ -1,5 +1,5 @@ /* - * $Id: parser.h,v 1.26 2005-06-29 16:01:32 bacon Exp $ + * $Id: parser.h,v 1.27 2005-07-04 10:02:00 bacon Exp $ */ #ifndef _XP_STX_PARSER_H_ @@ -29,6 +29,11 @@ enum XP_STX_PARSER_ERROR_MESSAGE_SELECTOR, XP_STX_PARSER_ERROR_ARGUMENT_NAME, XP_STX_PARSER_ERROR_TOO_MANY_ARGUMENTS, + + XP_STX_PARSER_ERROR_PRIMITIVE_KEYWORD, + XP_STX_PARSER_ERROR_PRIMITIVE_NUMBER, + XP_STX_PARSER_ERROR_PRIMITIVE_NOT_CLOSED, + XP_STX_PARSER_ERROR_TEMPORARIES_NOT_CLOSED, XP_STX_PARSER_ERROR_TOO_MANY_TEMPORARIES, XP_STX_PARSER_ERROR_PSEUDO_VARIABLE, diff --git a/ase/test/stx/test.st b/ase/test/stx/test.st index 6f34b0b2..c840c6ba 100644 --- a/ase/test/stx/test.st +++ b/ase/test/stx/test.st @@ -3,6 +3,7 @@ perform: method with: x with: y with: z with: a with: b with: c | a b c d e f g | + < primitive: 10 > " a := 'this is ''good'. a := #xxx niceMethod.