public static string ReadHexProgressive(string s, ref double d, out int digits) { digits = 0; for (int i = 0; i < s.Length; i++) { char c = s[i]; if (LexerUtils.CharIsHexDigit(c)) { int v = LexerUtils.HexDigit2Value(c); d *= 16.0; d += v; ++digits; } else { return(s.Substring(i)); } } return(string.Empty); }
private Token ReadNumberToken(int fromLine, int fromCol, bool leadingDot) { StringBuilder text = new StringBuilder(32); //INT : Digit+ //HEX : '0' [xX] HexDigit+ //BIN : '0' [bB] BinDigit+ //FLOAT : Digit+ '.' Digit* ExponentPart? // | '.' Digit+ ExponentPart? // | Digit+ ExponentPart //HEX_FLOAT : '0' [xX] HexDigit+ '.' HexDigit* HexExponentPart? // | '0' [xX] '.' HexDigit+ HexExponentPart? // | '0' [xX] HexDigit+ HexExponentPart // // ExponentPart : [eE] [+-]? Digit+ // HexExponentPart : [pP] [+-]? Digit+ bool isHex = false; bool isBin = false; bool dotAdded = false; bool exponentPart = false; bool exponentSignAllowed = false; if (leadingDot) { text.Append("0."); } else if (CursorChar() == '0') { text.Append(CursorChar()); char secondChar = CursorCharNext(); if (secondChar == 'x' || secondChar == 'X') { isHex = true; text.Append(CursorChar()); CursorCharNext(); } else if (secondChar == 'b' || secondChar == 'B') { isBin = true; text.Append(CursorChar()); CursorCharNext(); } } for (char c = CursorChar(); CursorNotEof(); c = CursorCharNext()) { if (exponentSignAllowed && (c == '+' || c == '-')) { exponentSignAllowed = false; text.Append(c); } else if (LexerUtils.CharIsDigit(c)) { text.Append(c); } else if (c == '.' && !dotAdded) { dotAdded = true; text.Append(c); } else if (LexerUtils.CharIsHexDigit(c) && isHex && !exponentPart) { text.Append(c); } else if (LexerUtils.CharIsBinDigit(c) && isBin && !exponentPart) { text.Append(c); } else if (c == 'e' || c == 'E' || (isHex && (c == 'p' || c == 'P'))) { text.Append(c); exponentPart = true; exponentSignAllowed = true; dotAdded = true; } else { break; } } TokenType numberType = TokenType.Number; if (isHex && (dotAdded || exponentPart)) { numberType = TokenType.Number_HexFloat; } else if (isHex) { numberType = TokenType.Number_Hex; } else if (isBin && (dotAdded || exponentPart)) { numberType = TokenType.Number_BinFloat; } else if (isBin) { numberType = TokenType.Number_Bin; } string tokenStr = text.ToString(); return(CreateToken(numberType, fromLine, fromCol, tokenStr)); }