//----------------------------------------------------------- public void Visit(NLitInt node) { Console.WriteLine($"+++++++++++++++ NLitInt ++++++++++++++++"); var intStr = node.AnchorToken.Lexeme; try { if (intStr.StartsWith("0o") || intStr.StartsWith("0O")) { intStr = intStr.Remove(0, 2); Convert.ToInt64(intStr, 8); } else if (intStr.StartsWith("0b") || intStr.StartsWith("0B")) { intStr = intStr.Remove(0, 2); Convert.ToInt64(intStr, 2); } else if (intStr.StartsWith("0x") || intStr.StartsWith("0X")) { intStr = intStr.Remove(0, 2); Convert.ToInt64(intStr, 16); } // Convert.ToInt64(intStr); Console.WriteLine("EXITO!!"); } catch (OverflowException) { throw new SemanticError( "Integer literal too large: " + intStr, node.AnchorToken); } }
public string Visit(NLitInt nLitInt) { string retVal = ""; Token token = nLitInt.AnchorToken; string lexeme = token.Lexeme; int lexemeLength = lexeme.Length; TokenCategory tokenCategory = token.Category; switch (tokenCategory) { case TokenCategory.BASE_2: { retVal = "\t\tldc.i8 " + Convert.ToInt64(lexeme.Substring(2, lexemeLength - 2), 2) + "\n"; break; } case TokenCategory.BASE_8: { retVal = "\t\tldc.i8 " + Convert.ToInt64(lexeme.Substring(2, lexemeLength - 2), 8) + "\n"; break; } case TokenCategory.BASE_10: { retVal = "\t\tldc.i8 " + lexeme + "\n"; break; } case TokenCategory.BASE_16: { retVal = "\t\tldc.i8 " + Convert.ToInt64(lexeme.Substring(2, lexemeLength - 2), 16) + "\n"; break; } } return(retVal); }
public void Visit(NLitInt nLitInt) { Token token = nLitInt.AnchorToken; string lexeme = token.Lexeme; TokenCategory tokenCategory = token.Category; bool errorFound = false; switch (tokenCategory) { case TokenCategory.BASE_2: { int maxNumerals = 64; int prefixLength = 2; string sanitizedLexeme = SanitizeLeadingZeros(lexeme, prefixLength); if (sanitizedLexeme.Length > maxNumerals + prefixLength) { errorFound = true; } break; } case TokenCategory.BASE_8: { int maxNumerals = 22; int prefixLength = 2; int maxMostSignificantNumeral = 1; string sanitizedLexeme = SanitizeLeadingZeros(lexeme, prefixLength); if (sanitizedLexeme.Length > maxNumerals + prefixLength) { errorFound = true; } if (Convert.ToInt16(lexeme.Substring(2, 1)) > maxMostSignificantNumeral) { errorFound = true; } break; } case TokenCategory.BASE_10: { int maxNumerals = 19; int prefixLength = 0; string highestDecimalRepresentation = "9223372036854775807"; string sanitizedLexeme = SanitizeLeadingZeros(lexeme, prefixLength); if (sanitizedLexeme.Length > maxNumerals + prefixLength) { errorFound = true; } if (sanitizedLexeme.Length == maxNumerals + prefixLength) { for (int i = 0; i < highestDecimalRepresentation.Length; i++) { if (Convert.ToInt16(highestDecimalRepresentation[i]) < Convert.ToInt16(sanitizedLexeme[i])) { errorFound = true; } } } break; } case TokenCategory.BASE_16: { int maxNumerals = 16; int prefixLength = 2; string sanitizedLexeme = SanitizeLeadingZeros(lexeme, prefixLength); if (sanitizedLexeme.Length > maxNumerals + prefixLength) { errorFound = true; } break; } } if (errorFound) { throw new SemanticError("Literal too big", token); } }