diff --git a/components/fx/lexer.cpp b/components/fx/lexer.cpp index 39cad9970a..9844a6de6e 100644 --- a/components/fx/lexer.cpp +++ b/components/fx/lexer.cpp @@ -1,7 +1,7 @@ #include "lexer.hpp" #include -#include +#include #include namespace Fx @@ -132,7 +132,7 @@ namespace Fx mColumn++; } - char Lexer::head() + unsigned char Lexer::head() { return *mHead; } @@ -289,21 +289,15 @@ namespace Fx Token Lexer::scanNumber() { double buffer; - - char* endPtr; - buffer = std::strtod(mHead, &endPtr); - - if (endPtr == nullptr) + const auto [endPtr, ec] = std::from_chars(mHead, mTail, buffer); + if (ec != std::errc()) error("critical error while parsing number"); - const char* tmp = mHead; + std::string_view literal(mHead, endPtr); mHead = endPtr; - for (; tmp != endPtr; ++tmp) - { - if ((*tmp == '.')) - return Float{ static_cast(buffer) }; - } + if (literal.find('.') != std::string_view::npos) + return Float{ static_cast(buffer) }; return Integer{ static_cast(buffer) }; } diff --git a/components/fx/lexer.hpp b/components/fx/lexer.hpp index f49dbcd694..c9120698aa 100644 --- a/components/fx/lexer.hpp +++ b/components/fx/lexer.hpp @@ -51,7 +51,7 @@ namespace Fx private: void drop(); void advance(); - char head(); + unsigned char head(); bool peekChar(char c); Token scanToken();