Parse math expressions with or without normalized whitespace

This commit is contained in:
2015-01-27 18:48:46 -08:00
parent cf5883d401
commit 5b0fe6f880
3 changed files with 21 additions and 9 deletions

View File

@@ -1,2 +1,2 @@
_extern_c_main: _extern_c_main:
jmp 0x1000:0x0d90 jmp 0x1000:0x0db4

View File

@@ -17,9 +17,10 @@ void _tokenizer_init(void)
_tokenizer_prev_next = NULL; _tokenizer_prev_next = NULL;
} }
char *_tokenize(char *ptr, char token) char *_tokenize(char *ptr, char *token)
{ {
char *orig = NULL; char *orig = NULL;
char *tokenptr = NULL;
int len = 0; int len = 0;
if ( ptr == NULL ) { if ( ptr == NULL ) {
@@ -31,7 +32,16 @@ char *_tokenize(char *ptr, char token)
orig = ptr; orig = ptr;
memset(&_tokenizer_value, 0x00, BASIC_TOKENIZER_MAX_LENGTH); memset(&_tokenizer_value, 0x00, BASIC_TOKENIZER_MAX_LENGTH);
while ( *ptr != token ) { while ( *ptr != 0x0 ) {
tokenptr = token;
/* I don't understand why this works. It shouldn't work. */
while ( *tokenptr != 0x0 && (*ptr == *tokenptr++) ) {};
/* ----------------------------------------------------- */
if ( *tokenptr == 0x00 ) {
break;
} else {
if ( *ptr == '\0' ) { if ( *ptr == '\0' ) {
ptr -= sizeof(char); ptr -= sizeof(char);
break; break;
@@ -39,6 +49,7 @@ char *_tokenize(char *ptr, char token)
ptr += sizeof(char); ptr += sizeof(char);
len += 1; len += 1;
} }
}
if ( len > BASIC_TOKENIZER_MAX_LENGTH ) { if ( len > BASIC_TOKENIZER_MAX_LENGTH ) {
basic_errno = BASIC_ERR_SYNTAX_TOKEN_LENGTH; basic_errno = BASIC_ERR_SYNTAX_TOKEN_LENGTH;
return NULL; return NULL;
@@ -152,14 +163,14 @@ struct basic_expr *basic_parse_expr(char *expbuf)
basic_errno = BASIC_ERR_SYNTAX_MULTIPLE_LVALUES; basic_errno = BASIC_ERR_SYNTAX_MULTIPLE_LVALUES;
return NULL; return NULL;
} else if ( ret->type == 0x0 ) { } else if ( ret->type == 0x0 ) {
ret->lval = atoi(_tokenize(expbuf, ' ')); ret->lval = atoi(_tokenize(expbuf, BASIC_TOKENIZER_TOKENS));
ret->lval_type = BASIC_LVAL_CONST; ret->lval_type = BASIC_LVAL_CONST;
flags = (flags + BASIC_FOUND_LVAL); flags = (flags + BASIC_FOUND_LVAL);
} else if ( ret->type != 0x0 && ((flags & BASIC_FOUND_RVAL) == BASIC_FOUND_RVAL)) { } else if ( ret->type != 0x0 && ((flags & BASIC_FOUND_RVAL) == BASIC_FOUND_RVAL)) {
basic_errno = BASIC_ERR_SYNTAX_MULTIPLE_RVALUES; basic_errno = BASIC_ERR_SYNTAX_MULTIPLE_RVALUES;
return NULL; return NULL;
} else if ( ret->type != 0x0 ) { } else if ( ret->type != 0x0 ) {
ret->rval = atoi(_tokenize(expbuf, ' ')); ret->rval = atoi(_tokenize(expbuf, BASIC_TOKENIZER_TOKENS));
ret->rval_type = BASIC_RVAL_CONST; ret->rval_type = BASIC_RVAL_CONST;
} }
} else if ( ret->type == 0x0 ) { } else if ( ret->type == 0x0 ) {

View File

@@ -30,6 +30,7 @@
#define BASIC_ERR_INTERNAL_UNIMPLEMENTED 9 #define BASIC_ERR_INTERNAL_UNIMPLEMENTED 9
#define BASIC_ERR_MATH_DBZ 10 #define BASIC_ERR_MATH_DBZ 10
#define BASIC_TOKENIZER_TOKENS " +-/%*="
#define BASIC_TOKENIZER_MAX_LENGTH 512 #define BASIC_TOKENIZER_MAX_LENGTH 512
#define BASIC_VARNAME_MAX_LENGTH 16 #define BASIC_VARNAME_MAX_LENGTH 16