protected static void AssertReaderToken(LuaTableTextReader reader, LuaTableReaderToken expectedToken) { if (reader.CurrentToken != expectedToken) { throw MakeUnexpectedTokenException(reader, expectedToken); } }
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)); }
protected static void SkipComments(LuaTableTextReader reader) { while (reader.CurrentToken == LuaTableReaderToken.Comment) { reader.Read(); } }
/// <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); } }
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); }
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)); }
/// <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); } }
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); }