/// <summary>
 /// Get a LiteralValueContext containing a BIN_CONST, INT_CONST, HEX_CONST, or a REAL_CONST
 /// as a String, and convert it to the "real" value, with the corresponding Type.
 /// </summary>
 /// <param name="context"></param>
 /// <returns>An Object of the needed Type, with the value</returns>
 private object GetNumericValue(XSharpParser.LiteralValueContext context)
 {
     Object ret = null;
     String value = context.GetText();
     //
     if (context.BIN_CONST() != null || context.INT_CONST() != null || context.HEX_CONST() != null)
     {
         bool isUnsigned = (value.Substring(0, 1).ToLower().CompareTo("u") == 0);
         // -1 for Unsigned; -2 for 0x or 0b
         int len = value.Length - (isUnsigned ? 1 : 0) - (context.BIN_CONST() != null || context.HEX_CONST() != null ? 2 : 0);
         //
         if (context.BIN_CONST() != null)
         {
             if (len > 64)
             {
                 ret = Double.NaN;
             }
             else
             {
                 // Don't forget to remove the prefix !!!
                 value = value.Substring(2);
                 // BIN are always unsigned (??)
                 UInt64 bin64;
                 try
                 {
                     bin64 = Convert.ToUInt64(value, 2);
                     // Maybe 32 bits is enough ?
                     if (bin64 <= UInt32.MaxValue)
                     {
                         UInt32 bin32 = Convert.ToUInt32(bin64);
                         ret = bin32;
                     }
                     else
                     {
                         ret = bin64;
                     }
                 }
                 catch
                 {
                     ret = Double.NaN;
                 }
             }
         }
         else if (context.HEX_CONST() != null)
         {
             if (len > 16)
             {
                 ret = Double.NaN;
             }
             else
             {
                 // Don't forget to remove the prefix !!!
                 value = value.Substring(2);
                 // HEX are always unsigned (??)
                 UInt64 hex64;
                 try
                 {
                     hex64 = Convert.ToUInt64(value, 16);
                     // Maybe 32 bits is enough ?
                     if (hex64 <= UInt32.MaxValue)
                     {
                         UInt32 hex32 = Convert.ToUInt32(hex64);
                         ret = hex32;
                     }
                     else
                     {
                         ret = hex64;
                     }
                 }
                 catch
                 {
                     ret = Double.NaN;
                 }
             }
         }
         else
         {
             // context.INT_CONST() != null
             if (len > 64)
             {
                 ret = Double.NaN;
             }
             else if (isUnsigned)
             {
                 UInt64 myUInt64;
                 try
                 {
                     myUInt64 = Convert.ToUInt64(value, 10);
                     // Maybe 32 bits is enough ?
                     if (myUInt64 <= UInt32.MaxValue)
                     {
                         UInt32 myUInt32 = Convert.ToUInt32(myUInt64);
                         ret = myUInt32;
                     }
                     else
                     {
                         ret = myUInt64;
                     }
                 }
                 catch
                 {
                     ret = Double.NaN;
                 }
             }
             else
             {
                 Int64 myInt64;
                 try
                 {
                     myInt64 = Convert.ToInt64(value, 10);
                     // Maybe 32 bits is enough ?
                     if ((myInt64 >= UInt32.MinValue) && (myInt64 <= UInt32.MaxValue))
                     {
                         Int32 myInt32 = Convert.ToInt32(myInt64);
                         ret = myInt32;
                     }
                     else
                     {
                         ret = myInt64;
                     }
                 }
                 catch
                 {
                     ret = Double.NaN;
                 }
             }
         }
     }
     else
     {
         double d;
         // Should be REAL_CONST
         if (!double.TryParse(value, out d))
         {
             d = double.NaN;
         }
         ret = d;
     }
     return ret;
 }
 private CodeExpression BuildLiteralValue(XSharpParser.LiteralValueContext context)
 {
     CodeExpression expr = null;
     ITerminalNode node;
     //
     node = context.BIN_CONST();
     if (node != null)
     {
         expr = new CodePrimitiveExpression(GetNumericValue(context));
     }
     node = context.INT_CONST();
     if (node != null)
     {
         expr = new CodePrimitiveExpression(GetNumericValue(context));
     }
     //
     node = context.HEX_CONST();
     if (node != null)
     {
         expr = new CodePrimitiveExpression(GetNumericValue(context));
     }
     //
     node = context.REAL_CONST();
     if (node != null)
     {
         expr = new CodePrimitiveExpression(GetNumericValue(context));
     }
     //
     node = context.TRUE_CONST();
     if (node != null)
     {
         expr = new CodePrimitiveExpression(true);
     }
     //
     node = context.FALSE_CONST();
     if (node != null)
     {
         expr = new CodePrimitiveExpression(false);
     }
     //
     node = context.STRING_CONST();
     if (node != null)
     {
         // Remove the quotes
         String value = context.GetText();
         value = value.Substring(1, value.Length - 2);
         expr = new CodePrimitiveExpression(value);
     }
     //
     node = context.ESCAPED_STRING_CONST();
     if (node != null)
     {
         // Remove the e in front of quotes, AND the Quotes
         String value = context.GetText();
         value = value.Substring(1);
         value = value.Substring(1, value.Length - 2);
         expr = new CodePrimitiveExpression(BuildUnEscapedString(value));
     }
     //
     node = context.CHAR_CONST();
     if (node != null)
     {
         // Remove the quotes
         String value = context.GetText();
         value = value.Substring(1, value.Length - 2);
         if (value.Length >= 1)
             expr = new CodePrimitiveExpression(value[0]);
     }
     //
     node = context.NIL();
     if (node != null)
     {
         expr = new CodeSnippetExpression("NIL");
     }
     //
     node = context.NULL();
     if (node != null)
     {
         expr = new CodePrimitiveExpression(null);
     }
     //
     node = context.NULL_ARRAY();
     if (node != null)
     {
         expr = new CodeSnippetExpression("NULL_ARRAY");
     }
     //
     node = context.NULL_CODEBLOCK();
     if (node != null)
     {
         expr = new CodeSnippetExpression("NULL_CODEBLOCK");
     }
     //
     node = context.NULL_DATE();
     if (node != null)
     {
         expr = new CodeSnippetExpression("NULL_DATE");
     }
     //
     node = context.NULL_OBJECT();
     if (node != null)
     {
         expr = new CodeSnippetExpression("NULL_OBJECT");
     }
     //            
     node = context.NULL_PSZ();
     if (node != null)
     {
         expr = new CodeSnippetExpression("NULL_PSZ");
     }
     //            
     node = context.NULL_PTR();
     if (node != null)
     {
         expr = new CodeSnippetExpression("NULL_PTR");
     }
     //            
     node = context.NULL_STRING();
     if (node != null)
     {
         expr = new CodeSnippetExpression("NULL_STRING");
     }
     //            
     node = context.NULL_SYMBOL();
     if (node != null)
     {
         expr = new CodeSnippetExpression("NULL_SYMBOL");
     }
     //
     node = context.SYMBOL_CONST();
     if (node != null)
     {
         expr = new CodeSnippetExpression(context.GetText().ToUpper());
     }
     //
     node = context.DATE_CONST();
     if (node != null)
     {
         expr = new CodeSnippetExpression(context.GetText());
     }
     //
     if ( expr == null )
     {
         expr = new CodeSnippetExpression(context.GetText());
     }
     return expr;
 }