Parse math expressions with or without normalized whitespace
This commit is contained in:
@@ -1,2 +1,2 @@
|
|||||||
_extern_c_main:
|
_extern_c_main:
|
||||||
jmp 0x1000:0x0d90
|
jmp 0x1000:0x0db4
|
||||||
|
|||||||
27
src/basic.c
27
src/basic.c
@@ -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,13 +32,23 @@ 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 ) {
|
||||||
if ( *ptr == '\0' ) {
|
tokenptr = token;
|
||||||
ptr -= sizeof(char);
|
|
||||||
|
/* I don't understand why this works. It shouldn't work. */
|
||||||
|
while ( *tokenptr != 0x0 && (*ptr == *tokenptr++) ) {};
|
||||||
|
/* ----------------------------------------------------- */
|
||||||
|
|
||||||
|
if ( *tokenptr == 0x00 ) {
|
||||||
break;
|
break;
|
||||||
|
} else {
|
||||||
|
if ( *ptr == '\0' ) {
|
||||||
|
ptr -= sizeof(char);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ptr += sizeof(char);
|
||||||
|
len += 1;
|
||||||
}
|
}
|
||||||
ptr += sizeof(char);
|
|
||||||
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;
|
||||||
@@ -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 ) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user