Example #1
0
 protected static void AssertReaderToken(LuaTableTextReader reader, LuaTableReaderToken expectedToken)
 {
     if (reader.CurrentToken != expectedToken)
     {
         throw MakeUnexpectedTokenException(reader, expectedToken);
     }
 }
Example #2
0
        public new static LValue Load(LuaTableTextReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }
            if (reader.CurrentToken == LuaTableReaderToken.None)
            {
                reader.Read();
            }
            SkipComments(reader);
            AssertReaderToken(reader, LuaTableReaderToken.Value);
            var rawValue = reader.CurrentValue;

            reader.Read();
            if (rawValue == null)
            {
                return(Nil);
            }
            if (rawValue is bool b)
            {
                return(b ? True : False);
            }
            if (rawValue is int i)
            {
                return(i);
            }
            return(new LValue(rawValue));
        }
Example #3
0
 protected static void SkipComments(LuaTableTextReader reader)
 {
     while (reader.CurrentToken == LuaTableReaderToken.Comment)
     {
         reader.Read();
     }
 }
Example #4
0
        /// <summary>
        /// Loads next <see cref="LToken"/> from the specified <see cref="LuaTableTextReader"/>.
        /// </summary>
        /// <param name="reader">The reader from which to load the next <see cref="LToken"/>.</param>
        /// <exception cref="ArgumentNullException"><paramref name="reader"/> is <c>null</c>.</exception>
        /// <exception cref="LuaTableReaderException">There are unexpected input in the <paramref name="reader"/>.</exception>
        /// <returns>The loaded Lua token.</returns>
        public static LToken Load(LuaTableTextReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }
            if (reader.CurrentToken == LuaTableReaderToken.None)
            {
                reader.Read();
            }
            SkipComments(reader);
            switch (reader.CurrentToken)
            {
            case LuaTableReaderToken.None:
            case LuaTableReaderToken.TableStart:
                return(LTable.Load(reader));

            case LuaTableReaderToken.Key:
                return(LField.Load(reader));

            case LuaTableReaderToken.Value:
                return(LValue.Load(reader));

            default:
                throw MakeUnexpectedTokenException(reader);
            }
        }
Example #5
0
        public new static LTable Load(LuaTableTextReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }
            if (reader.CurrentToken == LuaTableReaderToken.None)
            {
                reader.Read();
            }
            SkipComments(reader);
            AssertReaderToken(reader, LuaTableReaderToken.TableStart);
            // Read fields.
            reader.Read();
            SkipComments(reader);
            var table = new LTable();

            while (true)
            {
                if (reader.CurrentToken == LuaTableReaderToken.TableEnd)
                {
                    reader.Read();
                    break;
                }
                table.Add(LField.Load(reader));
            }
            return(table);
        }
Example #6
0
        protected static LuaTableReaderException MakeUnexpectedTokenException(LuaTableTextReader reader,
                                                                              LuaTableReaderToken expectedToken = LuaTableReaderToken.None)
        {
            if (reader.CurrentToken == LuaTableReaderToken.None)
            {
                return(new LuaTableReaderException("Unexpected end of input.", reader.CurrentPath));
            }
            var message = $"Unexpected Lua token: {reader.CurrentToken}.";

            if (expectedToken != LuaTableReaderToken.None)
            {
                message += $" Expected: {expectedToken}.";
            }
            return(new LuaTableReaderException(message, reader.CurrentPath));
        }
Example #7
0
 /// <summary>
 /// Parses the <see cref="LToken"/> from the specified Lua expression.
 /// </summary>
 /// <param name="expression">The Lua expression to be parsed.</param>
 /// <exception cref="ArgumentNullException"><paramref name="expression"/> is <c>null</c>.</exception>
 /// <exception cref="LuaTableReaderException"><paramref name="expression"/> is empty or invalid; or it contains extra content after the first parsed token.</exception>
 /// <returns>The loaded Lua token.</returns>
 public static LToken Parse(string expression)
 {
     if (expression == null)
     {
         throw new ArgumentNullException(nameof(expression));
     }
     using (var reader = new StringReader(expression))
         using (var lreader = new LuaTableTextReader(reader))
         {
             var token = Load(lreader);
             SkipComments(lreader);
             if (lreader.CurrentToken != LuaTableReaderToken.None)
             {
                 throw new LuaTableReaderException($"Detected extra content after parsing complete: {lreader.CurrentToken}.",
                                                   lreader.CurrentPath);
             }
             return(token);
         }
 }
Example #8
0
        public new static LField Load(LuaTableTextReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }
            if (reader.CurrentToken == LuaTableReaderToken.None)
            {
                reader.Read();
            }
            SkipComments(reader);
            LValue key = null;

            if (reader.CurrentToken == LuaTableReaderToken.Key)
            {
                key = new LValue(reader.CurrentValue);
                reader.Read();
                SkipComments(reader);
            }
            LToken value = LToken.Load(reader);

            return(new LField(key, value));
        }
 private void AssertNextToken(LuaTableTextReader reader, LuaTableReaderToken token, object value = null)
 {
     reader.Read();
     Assert.Equal(token, reader.CurrentToken);
     Assert.Equal(value, reader.CurrentValue);
 }