// File: /workspace/github_cpp_makefile_star2_O2/CobaltXII[P]cxcc/./parser/../lexer/token_stream.hpp
// Function: token_stream_t::next()
token_t next() {
		skip_whitespace();
		
		if (input.eof()) {
			return {tk_eof, "", TOKEN_DEBUG};
		}

		int ch = input.peek();

		// Skip comments.
		if (ch == '/' && input.peek_two() == '/') {
			skip_comment();
			return next();
		}

		// Check for identifiers.
		if (chr_id_start(ch)) {
			return read_identifier();
		}
		// Check for integer literals.
		else if (chr_digit(ch)) {
			return read_lit_integer();
		}
		// Check for string literals.
		else if (ch == '"') {
			return read_lit_string();
		}
		// Check for character literals.
		else if (ch == '\'') {
			return read_lit_character();
		}

		// Check for left parentheses.
		else if (ch == '(') {
			input.next();
			return {tk_left_parenthesis, "(", TOKEN_DEBUG};
		}
		// Check for right parentheses.
		else if (ch == ')') {
			input.next();
			return {tk_right_parenthesis, ")", TOKEN_DEBUG};
		}
		// Check for left brackets.
		else if (ch == '[') {
			input.next();
			return {tk_left_bracket, "[", TOKEN_DEBUG};
		}
		// Check for right brackets.
		else if (ch == ']') {
			input.next();
			return {tk_right_bracket, "]", TOKEN_DEBUG};
		}
		// Check for left braces.
		else if (ch == '{') {
			input.next();
			return {tk_left_brace, "{", TOKEN_DEBUG};
		}
		// Check for right braces.
		else if (ch == '}') {
			input.next();
			return {tk_right_brace, "}", TOKEN_DEBUG};
		}
		// Check for commas.
		else if (ch == ',') {
			input.next();
			return {tk_comma, ",", TOKEN_DEBUG};
		}
		// Check for semicolons.
		else if (ch == ';') {
			input.next();
			return {tk_semicolon, ";", TOKEN_DEBUG};
		}

		// Check for the ambiguous plus (+) operator and binary addition
		// assignment.
		else if (ch == '+') {
			input.next();
			if (input.eof()) {
				return {tk_plus, "+", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_addition_assignment, "+=", TOKEN_DEBUG};
			} else {
				return {tk_plus, "+", TOKEN_DEBUG};
			}
		}
		// Check for the ambiguous minus (-) operator and binary subtraction
		// assignment.
		else if (ch == '-') {
			input.next();
			if (input.eof()) {
				return {tk_minus, "-", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_subtraction_assignment, "-=", TOKEN_DEBUG};
			} else {
				return {tk_minus, "-", TOKEN_DEBUG};
			}
		}
		// Check for the ambiguous asterisk (*) operator and binary
		// multiplication assignment.
		else if (ch == '*') {
			input.next();
			if (input.eof()) {
				return {tk_asterisk, "*", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_multiplication_assignment, "*=", TOKEN_DEBUG};
			} else {
				return {tk_asterisk, "*", TOKEN_DEBUG};
			}
		}
		// Check for the ambiguous ampersand (&) operator, binary logical AND
		// and binary binary AND assignment.
		else if (ch == '&') {
			input.next();
			if (input.eof()) {
				return {tk_ampersand, "&", TOKEN_DEBUG};
			} else if (input.peek() == '&') {
				input.next();
				return {tk_bi_logical_and, "&&", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_binary_and_assignment, "&=", TOKEN_DEBUG};
			} else {
				return {tk_ampersand, "&", TOKEN_DEBUG};
			}
		}

		// Check for binary division and binary division assignment.
		else if (ch == '/') {
			input.next();
			if (input.eof()) {
				return {tk_bi_division, "/", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_division_assignment, "/=", TOKEN_DEBUG};
			} else {
				return {tk_bi_division, "/", TOKEN_DEBUG};
			}
		}
		// Check for binary modulo and binary modulo assignment.
		else if (ch == '%') {
			input.next();
			if (input.eof()) {
				return {tk_bi_modulo, "%", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_modulo_assignment, "%=", TOKEN_DEBUG};
			} else {
				return {tk_bi_modulo, "%", TOKEN_DEBUG};
			}
		}
		// Check for binary assignment and relational equals.
		else if (ch == '=') {
			input.next();
			if (input.eof()) {
				return {tk_bi_assignment, "=", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_relational_equal, "==", TOKEN_DEBUG};
			} else {
				return {tk_bi_assignment, "=", TOKEN_DEBUG};
			}
		}
		// Check for binary binary OR, binary logical OR and binary binary OR
		// assignment.
		else if (ch == '|') {
			input.next();
			if (input.eof()) {
				return {tk_bi_binary_or, "|", TOKEN_DEBUG};
			} else if (input.peek() == '|') {
				input.next();
				return {tk_bi_logical_or, "||", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_binary_or_assignment, "|=", TOKEN_DEBUG};
			} else {
				return {tk_bi_binary_or, "|", TOKEN_DEBUG};
			}
		}
		// Check for binary binary XOR and binary binary XOR assignment.
		else if (ch == '^') {
			input.next();
			if (input.eof()) {
				return {tk_bi_binary_xor, "^", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_binary_xor_assignment, "^=", TOKEN_DEBUG};
			} else {
				return {tk_bi_binary_xor, "^", TOKEN_DEBUG};
			}
		}
		// Check for binary relational non-equal and unary logical NOT.
		else if (ch == '!') {
			input.next();
			if (input.eof()) {
				return {tk_un_logical_not, "!", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_relational_non_equal, "!=", TOKEN_DEBUG};
			} else {
				return {tk_un_logical_not, "!", TOKEN_DEBUG};
			}
		}
		// Check for binary relational greater-than, binary relational
		// greater-than or equal-to, binary binary right-shift and binary
		// binary right-shift assignment.
		else if (ch == '>') {
			input.next();
			if (input.eof()) {
				return {tk_bi_relational_greater_than, ">", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_relational_greater_than_or_equal_to, ">=", TOKEN_DEBUG};
			} else if (input.peek() == '>') {
				input.next();
				if (input.eof()) {
					return {tk_bi_binary_right_shift, ">>", TOKEN_DEBUG};
				} else if (input.peek() == '=') {
					input.next();
					return {tk_bi_binary_right_shift_assignment, ">>=", TOKEN_DEBUG};
				} else {
					return {tk_bi_binary_right_shift, ">>", TOKEN_DEBUG};
				}
			} else {
				return {tk_bi_relational_greater_than, ">", TOKEN_DEBUG};
			}
		}
		// Check for binary relational lesser-than binary relational
		// lesser-than or equal-to, binary binary left-shift and binary binary
		// left-shift assignment.
		else if (ch == '<') {
			input.next();
			if (input.eof()) {
				return {tk_bi_relational_lesser_than, "<", TOKEN_DEBUG};
			} else if (input.peek() == '=') {
				input.next();
				return {tk_bi_relational_lesser_than_or_equal_to, "<=", TOKEN_DEBUG};
			} else if (input.peek() == '<') {
				input.next();
				if (input.eof()) {
					return {tk_bi_binary_left_shift, "<<", TOKEN_DEBUG};
				} else if (input.peek() == '=') {
					input.next();
					return {tk_bi_binary_left_shift_assignment, "<<=", TOKEN_DEBUG};
				} else {
					return {tk_bi_binary_left_shift, "<<", TOKEN_DEBUG};
				}
			} else {
				return {tk_bi_relational_lesser_than, "<", TOKEN_DEBUG};
			}
		}
		// Check for unary binary NOT.
		else if (ch == '~') {
			input.next();
			return {tk_un_binary_not, "~", TOKEN_DEBUG};
		}

		// Encountered an unexpected character.
		input.die("unexpected character");
		return {};
	}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x30, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movq %r14, %rdi
callq 0x5336
movq 0x60(%r14), %rcx
cmpq 0x48(%r14), %rcx
jae 0x4af5
movq 0x40(%r14), %rdx
movsbl (%rdx,%rcx), %eax
cmpl $0x2f, %eax
jne 0x4acb
cmpb $0x2f, 0x1(%rdx,%rcx)
jne 0x4acb
movq %r14, %rdi
callq 0x535e
jmp 0x4a9b
movzbl %al, %ecx
cmpl $0x5f, %ecx
je 0x4b1b
movl %eax, %edx
andl $-0x21, %edx
addl $-0x41, %edx
cmpl $0x19, %edx
jbe 0x4b1b
leal -0x30(%rax), %edx
cmpl $0x9, %edx
ja 0x4b33
movq %rbx, %rdi
movq %r14, %rsi
callq 0x54ae
jmp 0x4b26
movl $0x4, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xc28f(%rip), %rsi      # 0x10d95
leaq 0xf(%rsp), %rdx
callq 0x3a1e
movups 0x68(%r14), %xmm0
movups %xmm0, 0x28(%rbx)
jmp 0x4b26
movq %rbx, %rdi
movq %r14, %rsi
callq 0x539c
movq %rbx, %rax
addq $0x30, %rsp
popq %rbx
popq %r14
popq %r15
retq
leaq 0x20(%r14), %r15
leal -0x26(%rcx), %edx
cmpl $0x15, %edx
ja 0x4b9d
leaq 0xb4be(%rip), %rcx      # 0x10004
movslq (%rcx,%rdx,4), %rdx
addq %rcx, %rdx
jmpq *%rdx
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x4e28
movq 0x40(%r14), %rcx
movzbl (%rcx,%rax), %eax
cmpl $0x3d, %eax
je 0x4ee0
cmpl $0x26, %eax
jne 0x4e28
movq %r15, %rdi
callq 0x5542
movl $0x1c, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbd85(%rip), %rsi      # 0x1091d
jmp 0x4b06
cmpl $0x7d, %ecx
je 0x4daa
cmpl $0x5b, %ecx
je 0x4d8c
cmpl $0x5d, %ecx
je 0x4d6e
cmpl $0x7b, %ecx
je 0x4dc8
cmpl $0x22, %ecx
jne 0x4bd6
movq %rbx, %rdi
movq %r14, %rsi
callq 0x54e2
jmp 0x4b26
cmpb $0x2f, %al
jne 0x4e3e
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x4eca
movq 0x40(%r14), %rcx
cmpb $0x3d, (%rcx,%rax)
jne 0x4eca
movq %r15, %rdi
callq 0x5542
movl $0x1a, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbd0a(%rip), %rsi      # 0x10925
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x4de6
movq 0x40(%r14), %rcx
cmpb $0x3d, (%rcx,%rax)
jne 0x4de6
movq %r15, %rdi
callq 0x5542
movl $0x17, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbcb3(%rip), %rsi      # 0x10910
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movl $0x13, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbc91(%rip), %rsi      # 0x1090c
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x4dfc
movq 0x40(%r14), %rcx
cmpb $0x3d, (%rcx,%rax)
jne 0x4dfc
movq %r15, %rdi
callq 0x5542
movl $0x18, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbc58(%rip), %rsi      # 0x10915
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movl $0xd, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbf0d(%rip), %rsi      # 0x10be8
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movl $0xc, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbc09(%rip), %rsi      # 0x10902
jmp 0x4b06
movq %rbx, %rdi
movq %r14, %rsi
callq 0x5512
jmp 0x4b26
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x4e12
movq 0x40(%r14), %rcx
cmpb $0x3d, (%rcx,%rax)
jne 0x4e12
movq %r15, %rdi
callq 0x5542
movl $0x19, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbbcf(%rip), %rsi      # 0x1091a
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movl $0x12, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbba1(%rip), %rsi      # 0x1090a
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movl $0xf, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb9fe(%rip), %rsi      # 0x10785
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movl $0xe, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbb5f(%rip), %rsi      # 0x10904
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movl $0x11, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbb45(%rip), %rsi      # 0x10908
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movl $0x10, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbb25(%rip), %rsi      # 0x10906
jmp 0x4b06
movl $0x2f, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbb17(%rip), %rsi      # 0x1090e
jmp 0x4b06
movl $0x30, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbb06(%rip), %rsi      # 0x10913
jmp 0x4b06
movl $0x31, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbaf5(%rip), %rsi      # 0x10918
jmp 0x4b06
movl $0x32, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xbae5(%rip), %rsi      # 0x1091e
jmp 0x4b06
cmpb $0x21, %al
je 0x50d4
movzbl %al, %eax
cmpl $0x7e, %eax
je 0x4fdc
cmpl $0x3c, %eax
je 0x5086
cmpl $0x3d, %eax
je 0x5044
cmpl $0x3e, %eax
je 0x4efe
cmpl $0x5e, %eax
je 0x4f9a
cmpl $0x7c, %eax
je 0x4f4c
cmpl $0x25, %eax
jne 0x4ffa
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x5124
movq 0x40(%r14), %rcx
cmpb $0x3d, (%rcx,%rax)
jne 0x5124
movq %r15, %rdi
callq 0x5542
movl $0x1b, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xba65(%rip), %rsi      # 0x1092a
jmp 0x4b06
movl $0x14, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xba48(%rip), %rsi      # 0x10923
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movl $0x26, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xba27(%rip), %rsi      # 0x10920
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x5166
movq 0x40(%r14), %rcx
movzbl (%rcx,%rax), %eax
cmpl $0x3e, %eax
je 0x51a8
cmpl $0x3d, %eax
jne 0x5166
movq %r15, %rdi
callq 0x5542
movl $0x22, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb9fd(%rip), %rsi      # 0x10944
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x517c
movq 0x40(%r14), %rcx
movzbl (%rcx,%rax), %eax
cmpl $0x3d, %eax
je 0x51e6
cmpl $0x7c, %eax
jne 0x517c
movq %r15, %rdi
callq 0x5542
movl $0x1d, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb99b(%rip), %rsi      # 0x10930
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x510e
movq 0x40(%r14), %rcx
cmpb $0x3d, (%rcx,%rax)
jne 0x510e
movq %r15, %rdi
callq 0x5542
movl $0x28, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb961(%rip), %rsi      # 0x10938
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movl $0x2e, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb959(%rip), %rsi      # 0x1094e
jmp 0x4b06
leaq 0xb94f(%rip), %rsi      # 0x10950
leaq 0x10(%rsp), %r14
leaq 0xf(%rsp), %rdx
movq %r14, %rdi
callq 0x3a1e
movq %r15, %rdi
movq %r14, %rsi
callq 0x556a
leaq 0x10(%rsp), %rdi
callq 0x2100
andl $0x0, (%rbx)
leaq 0x18(%rbx), %rax
movq %rax, 0x8(%rbx)
andq $0x0, 0x10(%rbx)
movb $0x0, 0x18(%rbx)
xorps %xmm0, %xmm0
jmp 0x4b15
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x513a
movq 0x40(%r14), %rcx
cmpb $0x3d, (%rcx,%rax)
jne 0x513a
movq %r15, %rdi
callq 0x5542
movl $0x1e, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb8ac(%rip), %rsi      # 0x1092d
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x5192
movq 0x40(%r14), %rcx
movzbl (%rcx,%rax), %eax
cmpl $0x3c, %eax
je 0x5204
cmpl $0x3d, %eax
jne 0x5192
movq %r15, %rdi
callq 0x5542
movl $0x23, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb87c(%rip), %rsi      # 0x1094b
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x5150
movq 0x40(%r14), %rcx
cmpb $0x3d, (%rcx,%rax)
jne 0x5150
movq %r15, %rdi
callq 0x5542
movl $0x1f, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb834(%rip), %rsi      # 0x1093d
jmp 0x4b06
movl $0x25, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb817(%rip), %rsi      # 0x10936
jmp 0x4b06
movl $0x15, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb7f3(%rip), %rsi      # 0x10928
jmp 0x4b06
movl $0x16, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb7f3(%rip), %rsi      # 0x1093e
jmp 0x4b06
movl $0x2d, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb7da(%rip), %rsi      # 0x1093b
jmp 0x4b06
movl $0x20, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb7ca(%rip), %rsi      # 0x10941
jmp 0x4b06
movl $0x24, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb7a4(%rip), %rsi      # 0x10931
jmp 0x4b06
movl $0x21, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb7a5(%rip), %rsi      # 0x10948
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x523e
movq 0x40(%r14), %rcx
cmpb $0x3d, (%rcx,%rax)
jne 0x523e
movq %r15, %rdi
callq 0x5542
movl $0x2c, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb762(%rip), %rsi      # 0x10943
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movl $0x27, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb734(%rip), %rsi      # 0x10933
jmp 0x4b06
movq %r15, %rdi
callq 0x5542
movq 0x60(%r14), %rax
cmpq 0x48(%r14), %rax
jae 0x5254
movq 0x40(%r14), %rcx
cmpb $0x3d, (%rcx,%rax)
jne 0x5254
movq %r15, %rdi
callq 0x5542
movl $0x2b, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb711(%rip), %rsi      # 0x1094a
jmp 0x4b06
movl $0x2a, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb6f1(%rip), %rsi      # 0x10940
jmp 0x4b06
movl $0x29, (%rbx)
leaq 0x8(%rbx), %rdi
leaq 0xb6e2(%rip), %rsi      # 0x10947
jmp 0x4b06
movq %rax, %rbx
leaq 0x10(%rsp), %rdi
callq 0x2100
movq %rbx, %rdi
callq 0x2390
nop