@@ -8,6 +8,63 @@ namespace Luaon.Linq
88 public abstract class LToken
99 {
1010
11+ public static LToken Load ( LuaTableTextReader reader )
12+ {
13+ if ( reader == null ) throw new ArgumentNullException ( nameof ( reader ) ) ;
14+ if ( reader . CurrentToken == LuaTableReaderToken . None )
15+ reader . Read ( ) ;
16+ SkipComments ( reader ) ;
17+ switch ( reader . CurrentToken )
18+ {
19+ case LuaTableReaderToken . None :
20+ case LuaTableReaderToken . TableStart :
21+ return LTable . Load ( reader ) ;
22+ case LuaTableReaderToken . Key :
23+ return LField . Load ( reader ) ;
24+ case LuaTableReaderToken . Value :
25+ return LValue . Load ( reader ) ;
26+ default :
27+ throw MakeUnexpectedTokenException ( reader ) ;
28+ }
29+ }
30+
31+ public static LToken Parse ( string expression )
32+ {
33+ using ( var reader = new StringReader ( expression ) )
34+ using ( var lreader = new LuaTableTextReader ( reader ) )
35+ {
36+ var token = Load ( lreader ) ;
37+ SkipComments ( lreader ) ;
38+ if ( lreader . CurrentToken != LuaTableReaderToken . None )
39+ throw new LuaTableReaderException ( $ "Detected extra content after parsing complete: { lreader . CurrentToken } .",
40+ lreader . CurrentPath ) ;
41+ return token ;
42+ }
43+ }
44+
45+ protected static void SkipComments ( LuaTableTextReader reader )
46+ {
47+ while ( reader . CurrentToken == LuaTableReaderToken . Comment )
48+ reader . Read ( ) ;
49+ }
50+
51+ protected static void AssertReaderToken ( LuaTableTextReader reader , LuaTableReaderToken expectedToken )
52+ {
53+ if ( reader . CurrentToken != expectedToken )
54+ throw MakeUnexpectedTokenException ( reader , expectedToken ) ;
55+ }
56+
57+ protected static LuaTableReaderException MakeUnexpectedTokenException ( LuaTableTextReader reader ,
58+ LuaTableReaderToken expectedToken = LuaTableReaderToken . None )
59+ {
60+ if ( reader . CurrentToken == LuaTableReaderToken . None )
61+ return new LuaTableReaderException ( "Unexpected end of input." , reader . CurrentPath ) ;
62+ var message = $ "Unexpected Lua token: { reader . CurrentToken } .";
63+ if ( expectedToken != LuaTableReaderToken . None )
64+ message += $ " Expected: { expectedToken } .";
65+ return new LuaTableReaderException ( message , reader . CurrentPath ) ;
66+ }
67+
1168 /// <summary>
1269 /// Gets the token node type.
1370 /// </summary>
@@ -33,7 +90,7 @@ public string ToString(Formatting formatting)
3390 {
3491 using ( var writer = new StringWriter ( ) )
3592 {
36- using ( var lw = new LuaTableTextWriter ( writer ) { CloseWriter = false , Formatting = formatting } )
93+ using ( var lw = new LuaTableTextWriter ( writer ) { CloseWriter = false , Formatting = formatting } )
3794 {
3895 WriteTo ( lw ) ;
3996 }
@@ -55,60 +112,60 @@ public override string ToString()
55112
56113 public static explicit operator double ( LToken value )
57114 {
58- return ( double ) ( LValue ) value ;
115+ return ( double ) ( LValue ) value ;
59116 }
60117
61118 public static explicit operator double ? ( LToken value )
62119 {
63120 if ( value == null || value . TokenType == LTokenType . Nil ) return null ;
64- return ( double ) ( LValue ) value ;
121+ return ( double ) ( LValue ) value ;
65122 }
66123
67124 public static explicit operator float ( LToken value )
68125 {
69- return ( float ) ( double ) ( LValue ) value ;
126+ return ( float ) ( double ) ( LValue ) value ;
70127 }
71128
72129 public static explicit operator float ? ( LToken value )
73130 {
74- return ( float ? ) ( double ? ) value ;
131+ return ( float ? ) ( double ? ) value ;
75132 }
76133
77134 public static explicit operator long ( LToken value )
78135 {
79- return ( long ) ( LValue ) value ;
136+ return ( long ) ( LValue ) value ;
80137 }
81138
82139 public static explicit operator long ? ( LToken value )
83140 {
84141 if ( value . TokenType == LTokenType . Nil ) return null ;
85- return ( long ) ( LValue ) value ;
142+ return ( long ) ( LValue ) value ;
86143 }
87144
88145 public static explicit operator int ( LToken value )
89146 {
90- return ( int ) ( long ) value ;
147+ return ( int ) ( long ) value ;
91148 }
92149
93150 public static explicit operator int ? ( LToken value )
94151 {
95- return ( int ? ) ( long ? ) value ;
152+ return ( int ? ) ( long ? ) value ;
96153 }
97154
98155 public static explicit operator bool ( LToken value )
99156 {
100- return ( bool ) ( LValue ) value ;
157+ return ( bool ) ( LValue ) value ;
101158 }
102159
103160 public static explicit operator bool ? ( LToken value )
104161 {
105162 if ( value . TokenType == LTokenType . Nil ) return null ;
106- return ( bool ) value ;
163+ return ( bool ) value ;
107164 }
108165
109166 public static explicit operator string ( LToken value )
110167 {
111- return ( string ) ( LValue ) value ;
168+ return ( string ) ( LValue ) value ;
112169 }
113170
114171 public static implicit operator LToken ( bool value )
0 commit comments