fix totally broken hexadecimal constants
This commit is contained in:
parent
81e3e133c8
commit
d90778c40c
13
compiler.c
13
compiler.c
@ -193,18 +193,21 @@ static void emitConstant(KrkValue value) {
|
||||
static void number(int canAssign) {
|
||||
const char * start = parser.previous.start;
|
||||
int base = 10;
|
||||
|
||||
/* These special cases for hexadecimal, binary, octal values. */
|
||||
if (start[0] == '0' && (start[1] == 'x' || start[1] == 'X')) {
|
||||
base = 10;
|
||||
base = 16;
|
||||
start += 2;
|
||||
} else if (start[0] == '0' && (start[1] == 'b' || start[1] == 'B')) {
|
||||
base = 2;
|
||||
start += 2;
|
||||
} else if (start[0] == '0') {
|
||||
} else if (start[0] == '0' && (start[1] == 'o' || start[1] == 'O')) {
|
||||
base = 8;
|
||||
start += 1;
|
||||
start += 2;
|
||||
}
|
||||
|
||||
/* If it wasn't a special base, it may be a floating point value. */
|
||||
if (base == 10) {
|
||||
/* See if it's a float */
|
||||
for (size_t j = 0; j < parser.previous.length; ++j) {
|
||||
if (parser.previous.start[j] == '.') {
|
||||
double value = strtod(start, NULL);
|
||||
@ -213,6 +216,8 @@ static void number(int canAssign) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If we got here, it's an integer of some sort. */
|
||||
int value = strtol(start, NULL, base);
|
||||
emitConstant(INTEGER_VAL(value));
|
||||
}
|
||||
|
25
scanner.c
25
scanner.c
@ -127,31 +127,26 @@ static int isDigit(char c) {
|
||||
}
|
||||
|
||||
static KrkToken number(char c) {
|
||||
if (c == 0) {
|
||||
/* Hexadecimal */
|
||||
if (c == '0') {
|
||||
if (peek() == 'x' || peek() == 'X') {
|
||||
/* Hexadecimal */
|
||||
advance();
|
||||
do {
|
||||
char n = peek();
|
||||
if (isDigit(n) || (n >= 'a' && n <= 'f') || (n >= 'A' && n <= 'F')) {
|
||||
advance();
|
||||
continue;
|
||||
}
|
||||
} while (0);
|
||||
while (isDigit(peek()) || (peek() >= 'a' && peek() <= 'f') ||
|
||||
(peek() >= 'A' && peek() <= 'F')) advance();
|
||||
return makeToken(TOKEN_NUMBER);
|
||||
}
|
||||
|
||||
} else if (peek() == 'b' || peek() == 'B') {
|
||||
/* Binary */
|
||||
if (peek() == 'b' || peek() == 'B') {
|
||||
advance();
|
||||
while (peek() == '0' || peek() == '1') advance();
|
||||
return makeToken(TOKEN_NUMBER);
|
||||
}
|
||||
|
||||
/* Octal */
|
||||
} if (peek() == 'o' || peek() == 'O') {
|
||||
/* Octal - must be 0o, none of those silly 0123 things */
|
||||
advance();
|
||||
while (peek() >= '0' && peek() <= '7') advance();
|
||||
return makeToken(TOKEN_NUMBER);
|
||||
}
|
||||
/* Otherwise, decimal and maybe 0.123 floating */
|
||||
}
|
||||
|
||||
/* Decimal */
|
||||
while (isDigit(peek())) advance();
|
||||
|
Loading…
Reference in New Issue
Block a user