@@ -135,7 +135,7 @@ public static bool TryParseMulDivExpression(this SourceCode sc, [NotNullWhen(tru
135135 ref var left = ref result ;
136136 char op = '\0 ' ;
137137
138- while ( sc . TryParseValueExpression ( out var right ) ) {
138+ while ( sc . TryParseGetExpression ( out var right ) ) {
139139 switch ( op ) {
140140 case '\0 ' when left is null :
141141 left = right ;
@@ -173,12 +173,51 @@ public static bool TryParseMulDivExpression(this SourceCode sc, [NotNullWhen(tru
173173 }
174174 }
175175
176+ public static bool TryParseGetExpression ( this SourceCode sc , [ NotNullWhen ( true ) ] [ MaybeNullWhen ( false ) ] out SifoscObject ? result )
177+ {
178+ sc . BeginScope ( ) ;
179+
180+ result = null ;
181+ ref var left = ref result ;
182+ char op = '\0 ' ;
183+
184+ while ( sc . TryParseValueExpression ( out var right ) ) {
185+ switch ( op ) {
186+ case '\0 ' when left is null :
187+ left = right ;
188+ break ;
189+ case '.' :
190+ left = left ? . Get ( right ) ;
191+ break ;
192+ default :
193+ left = null ;
194+ goto end ;
195+ }
196+
197+ sc . SkipSpaces ( ) ;
198+ if ( ! sc . TryReadChar ( out op ) || op is not '.' ) {
199+ if ( op != '\0 ' ) {
200+ sc . Retreat ( ) ;
201+ }
202+ break ;
203+ }
204+ }
205+
206+ end :
207+ if ( result is null ) {
208+ sc . EndScope ( true ) ;
209+ return false ;
210+ } else {
211+ sc . EndScope ( false ) ;
212+ return true ;
213+ }
214+ }
215+
176216 public static bool TryParseValueExpression ( this SourceCode sc , [ NotNullWhen ( true ) ] [ MaybeNullWhen ( false ) ] out SifoscObject ? result )
177217 {
178218 sc . SkipSpaces ( ) ;
179219
180220 return sc . TryParseParenthesisExpression ( out result )
181- || sc . TryParseGetExpression ( out result )
182221 || sc . TryParseSignExpression ( out result )
183222 || sc . TryParseNotExpression ( out result )
184223 || sc . TryParseValueLiteral ( out result ) ;
@@ -201,34 +240,6 @@ public static bool TryParseParenthesisExpression(this SourceCode sc, [NotNullWhe
201240 return false ;
202241 }
203242
204- public static bool TryParseGetExpression ( this SourceCode sc , [ NotNullWhen ( true ) ] [ MaybeNullWhen ( false ) ] out SifoscObject ? result )
205- {
206- sc . BeginScope ( ) ;
207-
208- if ( sc . TryParseValueExpression ( out var left ) ) {
209- sc . SkipSpaces ( ) ;
210- if ( sc . AdvanceIf ( '.' ) && sc . TryParseValueExpression ( out var right ) ) {
211- result = left . Get ( right ) ;
212-
213- if ( result is null ) {
214- goto fail ;
215- } else {
216- goto succeed ;
217- }
218- }
219- }
220-
221- result = null ;
222-
223- fail :
224- sc . EndScope ( true ) ;
225- return false ;
226-
227- succeed :
228- sc . EndScope ( false ) ;
229- return true ;
230- }
231-
232243 public static bool TryParseSignExpression ( this SourceCode sc , [ NotNullWhen ( true ) ] [ MaybeNullWhen ( false ) ] out SifoscObject ? result )
233244 {
234245 sc . BeginScope ( ) ;
0 commit comments