# HG changeset patch # User David Anderson # Date 1346544666 25200 # Node ID 2b9141b01023ff387d62df80e6de83e1227df5e4 # Parent f875ce723f2ca2cc7e84e1c81ca603ec28ab433d Add hex literal support. diff -r f875ce723f2c -r 2b9141b01023 src/Parser.cpp --- a/src/Parser.cpp Sat Sep 01 17:10:56 2012 -0700 +++ b/src/Parser.cpp Sat Sep 01 17:11:06 2012 -0700 @@ -143,6 +143,13 @@ return new (pool_) FloatLiteral(scanner_.begin(), value); } + case TOK_HEX_LITERAL: + { + scanner_.scan(); + int value = strtol(scanner_.literal(), NULL, 16); + return new (pool_) IntegerLiteral(scanner_.begin(), value); + } + case TOK_INTEGER_LITERAL: { scanner_.scan(); diff -r f875ce723f2c -r 2b9141b01023 src/Scanner.cpp --- a/src/Scanner.cpp Sat Sep 01 17:10:56 2012 -0700 +++ b/src/Scanner.cpp Sat Sep 01 17:11:06 2012 -0700 @@ -278,6 +278,27 @@ } TokenKind +Scanner::hexLiteral() +{ + literal_.clear(); + + char c; + for (;;) { + c = getChar(); + if (!IsHexDigit(c)) + break; + if (!literal_.append(c)) + return TOK_ERROR; + } + + putChar(c); + + if (!literal_.append('\0')) + return TOK_ERROR; + return TOK_HEX_LITERAL; +} + +TokenKind Scanner::numberLiteral(char first) { literal_.clear(); @@ -293,6 +314,14 @@ return TOK_ERROR; } + // Detect a hexadecimal string. + if (literal_.length() == 1 && + literal_[0] == '0' && + (c == 'x' || c == 'X')) + { + return hexLiteral(); + } + if (c != '.') { putChar(c); if (!literal_.append('\0')) diff -r f875ce723f2c -r 2b9141b01023 src/Scanner.h --- a/src/Scanner.h Sat Sep 01 17:10:56 2012 -0700 +++ b/src/Scanner.h Sat Sep 01 17:11:06 2012 -0700 @@ -52,6 +52,7 @@ void calcNewLine(char c); int readEscapeCode(); TokenKind stringLiteral(); + TokenKind hexLiteral(); TokenKind numberLiteral(char first); TokenKind identifier(char first); diff -r f875ce723f2c -r 2b9141b01023 src/Token.h --- a/src/Token.h Sat Sep 01 17:10:56 2012 -0700 +++ b/src/Token.h Sat Sep 01 17:11:06 2012 -0700 @@ -52,6 +52,7 @@ _(RETURN, "'return'") \ _(NAME, "") \ _(INTEGER_LITERAL, "") \ + _(HEX_LITERAL, "") \ _(FLOAT_LITERAL, "") \ _(STRING_LITERAL, "") \ _(IF, "") \