示例#1
0
 /// <summary>
 /// </summary>
 /// <param name="reader"></param>
 public ILTokenizer (StreamReader reader)
 {
         this.reader = new ILReader (reader);
         strBuilder = new StringHelper (this);
         numBuilder = new NumberHelper (this);
         lastToken = ILToken.Invalid.Clone () as ILToken;
 }
示例#2
0
		/// <summary>
		/// </summary>
		/// <param name="ch"></param>
		/// <returns></returns>
		public static int Escape (ILReader reader, int ch)
		{
			int res = -1;

			if (ch >= '0' && ch <='7') {
				StringBuilder octal = new StringBuilder ();
				octal.Append ((char)ch);
				int possibleOctalChar = reader.Peek ();
				if (possibleOctalChar >= '0' && possibleOctalChar <='7') {
					octal.Append ((char)reader.Read ());
					possibleOctalChar = reader.Peek ();
					if (possibleOctalChar >= '0' && possibleOctalChar <='7')
						octal.Append ((char)reader.Read ());
				}
				res = Convert.ToInt32(octal.ToString (), 8);
			} else {
				int id = "abfnrtv\"'\\".IndexOf ((char)ch);
				if (id != -1) {
					res = "\a\b\f\n\r\t\v\"'\\" [id];
				}
			}

			return res;
		}
        /// <summary>
        /// </summary>
        /// <returns></returns>
        public override string Build()
        {
            ILReader reader = host.Reader;

            reader.MarkLocation();
            StringBuilder num_builder = new StringBuilder();
            string        num;
            int           ch;
            int           peek;
            bool          is_real   = false;
            bool          dec_found = false;

            NumberStyles nstyles = NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint |
                                   NumberStyles.AllowLeadingSign;

            ch   = reader.Read();
            peek = reader.Peek();
            reader.Unread(ch);

            if (ch == '0' && (peek == 'x' || peek == 'X'))
            {
                return(BuildHex());
            }

            if (is_sign(reader.Peek()))
            {
                num_builder.Append((char)reader.Read());
            }

            do
            {
                ch   = reader.Read();
                peek = reader.Peek();
                num_builder.Append((char)ch);

                if (is_e(ch))
                {
                    if (is_real)
                    {
                        throw new ILTokenizingException(reader.Location, num_builder.ToString());
                    }

                    is_real = true;
                }
                if (ch == '.')
                {
                    dec_found = true;
                }
                if (!is_hex(peek) &&
                    !(peek == '.' && !dec_found) && !is_e(peek) &&
                    !(is_sign(peek) && is_real))
                {
                    break;
                }
            }while (ch != -1);

            num = num_builder.ToString();

            // Check for hexbytes
            if (num.Length == 2)
            {
                if (Char.IsLetter(num[0]) || Char.IsLetter(num[1]))
                {
                    result.token = Token.HEXBYTE;
                    result.val   = Byte.Parse(num, NumberStyles.HexNumber);
                    return(num);
                }
            }

            if (ch == '.' && peek == '.')
            {
                num = num.Substring(0, num.Length - 1);
                reader.Unread('.');
                dec_found = false;
            }
            else if (ch == '.')
            {
                num += '0';
            }

            if (!dec_found && !is_real)
            {
                try
                {
                    long i = Int64.Parse(num, nstyles);
                    result.token = Token.INT64;
                    result.val   = i;

                    return(num);
                }
                catch
                {
                }

                try
                {
                    long i = (long)UInt64.Parse(num, nstyles);
                    result.token = Token.INT64;
                    result.val   = i;

                    return(num);
                }
                catch
                {
                }
            }

            try
            {
                double d = Double.Parse(num, nstyles, NumberFormatInfo.InvariantInfo);
                result.token = Token.FLOAT64;
                result.val   = d;
            }
            catch
            {
                reader.Unread(num.ToCharArray());
                reader.RestoreLocation();
                num = String.Empty;
                Reset();
                throw new ILTokenizingException(reader.Location, num_builder.ToString());
            }
            return(num);
        }
示例#4
0
        /// <summary>
        /// </summary>
        /// <returns></returns>
        public override string Build()
        {
            if (mode == Token.UNKNOWN)
            {
                return(String.Empty);
            }
            int ch = 0;

            ILReader reader = host.Reader;

            StringBuilder idsb = new StringBuilder();

            if (mode == Token.SQSTRING || mode == Token.QSTRING)
            {
                int term = (mode == Token.SQSTRING) ? '\'' : '"';
                reader.Read();                  // skip quote
                for (ch = reader.Read(); ch != -1; ch = reader.Read())
                {
                    if (ch == term)
                    {
                        break;
                    }

                    if (ch == '\\')
                    {
                        ch = reader.Read();

                        /*
                         * Long string can be broken across multiple lines
                         * by using '\' as the last char in line.
                         * Any white space chars between '\' and the first
                         * char on the next line are ignored.
                         */
                        if (ch == '\n')
                        {
                            reader.SkipWhitespace();
                            continue;
                        }

                        int escaped = Escape(reader, ch);
                        if (escaped == -1)
                        {
                            reader.Unread(ch);
                            ch = '\\';
                        }
                        else
                        {
                            ch = escaped;
                        }
                    }

                    idsb.Append((char)ch);
                }
            }
            else                 // ID
            {
                while ((ch = reader.Read()) != -1)
                {
                    if (IsIdChar(ch))
                    {
                        idsb.Append((char)ch);
                    }
                    else
                    {
                        reader.Unread(ch);
                        break;
                    }
                }
            }
            return(idsb.ToString());
        }
        public string BuildHex()
        {
            ILReader reader = host.Reader;

            reader.MarkLocation();
            StringBuilder num_builder = new StringBuilder();
            NumberStyles  nstyles     = NumberStyles.HexNumber;

            string num;
            int    ch;
            int    peek;

            ch = reader.Read();
            if (ch != '0')
            {
                throw new ILTokenizingException(reader.Location, ((char)ch).ToString());
            }

            ch = reader.Read();

            if (ch != 'x' && ch != 'X')
            {
                throw new ILTokenizingException(reader.Location, "0" + (char)ch);
            }

            do
            {
                ch   = reader.Read();
                peek = reader.Peek();
                num_builder.Append((char)ch);

                if (!is_hex((char)peek))
                {
                    break;
                }

                if (num_builder.Length == 32)
                {
                    throw new ILTokenizingException(reader.Location, num_builder.ToString());
                }
            }while (ch != -1);

            num = num_builder.ToString();

            try
            {
                long i = (long)UInt64.Parse(num, nstyles);
                //if (i < Int32.MinValue || i > Int32.MaxValue) {
                result.token = Token.INT64;
                result.val   = i;
                //} else {
                //        result.token = Token.INT32;
                //        result.val = (int) i;
                //}
            }
            catch
            {
                string tnum = num;
                reader.Unread(num.ToCharArray());
                reader.RestoreLocation();
                num = String.Empty;
                Reset();
                throw new ILTokenizingException(reader.Location, tnum);
            }
            return(num);
        }