Пример #1
0
//-----------------------------------------------------------
        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);
            }
        }
Пример #2
0
        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);
            }
        }