+
+ obstack_1grow(&symbol_obstack, '\0');
+ size_t size = obstack_object_size(&symbol_obstack) - 1;
+ char *string = obstack_finish(&symbol_obstack);
+ lexer_token.number.number = identify_string(string, size);
+
+ /* is it an octal number? */
+ if (is_float) {
+ lexer_token.kind = T_FLOATINGPOINT;
+ } else if (string[0] == '0') {
+ lexer_token.kind = T_INTEGER_OCTAL;
+
+ /* check for invalid octal digits */
+ for (size_t i= 0; i < size; ++i) {
+ char t = string[i];
+ if (t >= '8')
+ errorf(&lexer_token.base.source_position,
+ "invalid digit '%c' in octal number", t);
+ }
+ } else {
+ lexer_token.kind = T_INTEGER;
+ }
+
+ if (!has_digits) {
+ errorf(&lexer_token.base.source_position, "invalid number literal '%S'",
+ &lexer_token.number.number);
+ }
+
+ parse_number_suffix();