Removed unnecessary debugging output
[fridhskrift.git] / lexer / number.cpp
blob7c12e23646d1111cb8ad505b5a2d226dae9fa607
1 #include <fridh/lexer.hpp>
2 #include <ail/string.hpp>
4 namespace fridh
6 bool lexer::parse_number(line_of_code & output)
8 std::size_t start = i;
9 char byte = input[i];
11 if(ail::is_digit(byte))
13 i++;
14 if(byte == '0')
16 std::size_t remaining_bytes = end - i;
17 if(remaining_bytes > 1)
19 char next_byte = input[i + 1];
20 if(next_byte == 'x')
22 i++;
23 remaining_bytes = end - i;
24 if(remaining_bytes == 0)
25 number_parsing_error("Incomplete hex number at the end of the input");
27 std::size_t hex_start = i;
29 for(; i < end && ail::is_hex_digit(input[i]); i++);
31 std::size_t hex_length = i - hex_start;
32 if(hex_length == 0)
33 lexer_error("Incomplete hex number");
35 std::string hex_string = input.substr(hex_start, i - end);
36 types::unsigned_integer value = ail::string_to_number<types::unsigned_integer>(hex_string, std::ios_base::hex);
37 output.lexemes.push_back(lexeme(value));
38 return true;
43 char const dot = '.';
45 bool got_dot = false;
46 char last_byte = byte;
47 for(; i < end; i++)
49 byte = input[i];
50 if(byte == dot)
52 if(got_dot)
53 number_parsing_error("Encountered a floating point value containing multiple dots");
54 else
55 got_dot = true;
57 else if(!ail::is_digit(byte))
58 break;
60 last_byte = byte;
63 if(last_byte == dot)
64 number_parsing_error("Encountered a floating point value ending with a dot");
66 std::string number_string = input.substr(start, i - start);
67 lexeme current_lexeme;
68 if(got_dot)
69 current_lexeme = lexeme(ail::string_to_number<types::floating_point_value>(number_string));
70 else
71 current_lexeme = lexeme(ail::string_to_number<types::signed_integer>(number_string));
72 output.lexemes.push_back(current_lexeme);
74 return true;
76 else
77 return false;