Exemple #1
0
        //
        // Binary
        //

        private static byte[] ParseBytes(Water.TextReader reader)
        {
            #region ParseBytes

            System.IO.StringWriter writer = new System.IO.StringWriter();

            // Read the '['
            reader.Read();

            while (reader.Peek() != -1)
            {
                char ch = (char)reader.Read();

                if (ch == ']')
                {
                    byte[] bytes = System.Convert.FromBase64String(writer.ToString());
                    writer.Close();
                    return(bytes);
                }

                writer.Write(ch);
            }

            throw new Water.Error("Invalid bytestring.");

            #endregion
        }
Exemple #2
0
        private static void ParseIndexer(Water.TextReader reader, System.Text.StringBuilder stringBuilder)
        {
            #region ParseIndexer

            stringBuilder.Append((char)reader.Read());

            while (reader.Peek() != -1)
            {
                char ch = (char)reader.Peek();

                if (ch == ']')
                {
                    stringBuilder.Append(ch);
                    reader.Read();
                    return;
                }
                else
                {
                    stringBuilder.Append(ch);
                    reader.Read();
                }
            }

            throw new Water.Error("Parser error: End of indexer expected.");

            #endregion
        }
Exemple #3
0
        //
        // Dictionaries
        //

        private static Water.Dictionary ParseDictionary(Water.TextReader reader)
        {
            #region ParseDictionary

            Water.Dictionary dict = new Water.Dictionary();

            // Read the '{'
            reader.Read();

            TrimWhitespace(reader);

            while (reader.Peek() != -1)
            {
                char ch = (char)reader.Peek();

                if (ch == '}')
                {
                    //Exit state
                    reader.Read();
                    return(dict);
                }
                else
                {
                    ParseDictEntry(reader, dict);
                }

                TrimWhitespace(reader);
            }

            throw new Water.Error("Parser error: End of dictionary expected.");

            #endregion
        }
Exemple #4
0
        //
        // Lists
        //

        public static Water.List ParseList(Water.TextReader reader)
        {
            #region ParseList

            Water.List list = new Water.List();

            // Read the '('
            reader.Read();

            TrimWhitespace(reader);

            while (reader.Peek() != -1)
            {
                char ch = (char)reader.Peek();

                if (ch == ')')
                {
                    reader.Read();
                    return(list);
                }
                else
                {
                    list.Add(Water.Parser.Parse(reader));
                }

                TrimWhitespace(reader);
            }

            throw new Water.Error("Parser error: Invalid list.");

            #endregion
        }
Exemple #5
0
        private static string ParseName(Water.TextReader reader)
        {
            #region ParseName

            System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();

            while (reader.Peek() != -1)
            {
                char ch = (char)reader.Peek();

                if (ch == ':')
                {
                    return(stringBuilder.ToString());
                }
                else
                {
                    stringBuilder.Append(ch);
                    reader.Read();
                }
            }

            throw new Water.Error("Parser error: " + stringBuilder.ToString());

            #endregion
        }
Exemple #6
0
        private static void ParseDictEntry(Water.TextReader reader, Water.Dictionary dict)
        {
            #region ParseDictEntry

            TrimWhitespace(reader);

            string name = ParseName(reader);

            TrimWhitespace(reader);

            if (reader.Peek() == ':')
            {
                reader.Read();
            }
            else
            {
                throw new Water.Error("Parser error: Invalid dictionary entry name: " + name);
            }

            TrimWhitespace(reader);

            dict.Add(name, Parse(reader));

            #endregion
        }
Exemple #7
0
        //
        // Comma-prefixed expressions
        //

        private static Water.Comma ParseComma(Water.TextReader reader)
        {
            #region ParseComma

            // Read the ','
            reader.Read();

            return(new Water.Comma(Parse(reader)));

            #endregion
        }
Exemple #8
0
        //
        // Quote-prefixed expressions
        //

        private static Water.Quote ParseQuote(Water.TextReader reader)
        {
            #region ParseQuote

            // Read the '\''
            reader.Read();

            return(new Water.Quote(Parse(reader)));

            #endregion
        }
Exemple #9
0
        public static void TrimNewline(Water.TextReader reader)
        {
            #region TrimNewline

            while (reader.Peek() != -1)
            {
                if (!IsNewline((char)reader.Peek()))
                {
                    return;
                }
                reader.Read();
            }

            #endregion
        }
Exemple #10
0
        public static void ParseComment(Water.TextReader reader)
        {
            #region ParseComment

            while (reader.Peek() != -1)
            {
                if (IsNewline((char)reader.Peek()))
                {
                    return;
                }
                else
                {
                    reader.Read();
                }
            }

            #endregion
        }
Exemple #11
0
        //
        // Atoms
        //

        private static object ParseAtom(Water.TextReader reader)
        {
            #region ParseAtom

            System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();

            while (reader.Peek() != -1)
            {
                char ch = (char)reader.Peek();

                if (IsWhitespace(ch))
                {
                    break;
                }
                else if (ch == '[')
                {
                    ParseIndexer(reader, stringBuilder);
                }
                else if (ch == '(')
                {
                    return(Coerce(stringBuilder.ToString()));
                }
                else if (ch == ')')
                {
                    return(Coerce(stringBuilder.ToString()));
                }
                else if (ch == '}')
                {
                    return(Coerce(stringBuilder.ToString()));
                }
                else
                {
                    stringBuilder.Append(ch);
                    reader.Read();
                }
            }

            return(Coerce(stringBuilder.ToString()));

            #endregion
        }
Exemple #12
0
        //
        // Strings
        //

        private static string ParseString(Water.TextReader reader)
        {
            #region ParseString

            System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();

            // Read the '\"'
            reader.Read();

            bool isEscaped = false;
            while (reader.Peek() != -1)
            {
                char ch = (char)reader.Read();

                if (isEscaped)
                {
                    switch (ch)
                    {
                    case '\\':
                    {
                        stringBuilder.Append("\\");
                        break;
                    }

                    case '"':
                    {
                        stringBuilder.Append("\"");
                        break;
                    }

                    case '\'':
                    {
                        stringBuilder.Append("\'");
                        break;
                    }

                    case '0':
                    {
                        stringBuilder.Append("\0");
                        break;
                    }

                    case 'a':
                    {
                        stringBuilder.Append("\a");
                        break;
                    }

                    case 'b':
                    {
                        stringBuilder.Append("\b");
                        break;
                    }

                    case 'f':
                    {
                        stringBuilder.Append("\f");
                        break;
                    }

                    case 'n':
                    {
                        stringBuilder.Append("\n");
                        break;
                    }

                    case 'r':
                    {
                        stringBuilder.Append("\r");
                        break;
                    }

                    case 't':
                    {
                        stringBuilder.Append("\t");
                        break;
                    }

                    case 'v':
                    {
                        stringBuilder.Append("\v");
                        break;
                    }

                    default:
                    {
                        throw new Water.Error("Unknown escape sequence: \\" + ch);
                    }
                    }

                    isEscaped = false;
                }
                else if (ch == '\\')
                {
                    isEscaped = true;
                }
                else if (!isEscaped && ch == '"')
                {
                    return(stringBuilder.ToString());
                }
                else
                {
                    stringBuilder.Append(ch);
                }
            }

            throw new Water.Error("Parser error: End of double-quoted string expected.  " + stringBuilder.ToString());

            #endregion
        }