@@ -295,7 +295,85 @@ fn add_duplicate_occurrence<T: Eq + PartialEq + Clone>(
295295}
296296
297297impl < ' input > GrmtoolsSectionParser < ' input > {
298- pub fn parse_value (
298+ fn parse_setting ( & ' _ self , mut i : usize ) -> Result < ( Setting < Span > , usize ) , HeaderError < Span > > {
299+ i = self . parse_ws ( i) ;
300+ match RE_DIGITS . find ( & self . src [ i..] ) {
301+ Some ( m) => {
302+ let num_span = Span :: new ( i + m. start ( ) , i + m. end ( ) ) ;
303+ let num_str = & self . src [ num_span. start ( ) ..num_span. end ( ) ] ;
304+ // If the above regex matches we expect this to succeed.
305+ let num = str:: parse :: < u64 > ( num_str) . unwrap ( ) ;
306+ let val = Setting :: Num ( num, num_span) ;
307+ i = self . parse_ws ( num_span. end ( ) ) ;
308+ Ok ( ( val, i) )
309+ }
310+ None => match RE_STRING . find ( & self . src [ i..] ) {
311+ Some ( m) => {
312+ let end = i + m. end ( ) ;
313+ // Trim the leading and trailing quotes.
314+ let str_span = Span :: new ( i + m. start ( ) + 1 , end - 1 ) ;
315+ let str = & self . src [ str_span. start ( ) ..str_span. end ( ) ] ;
316+ let setting = Setting :: String ( str. to_string ( ) , str_span) ;
317+ // After the trailing quotes.
318+ i = self . parse_ws ( end) ;
319+ Ok ( ( setting, i) )
320+ }
321+ None => {
322+ if let Some ( mut j) = self . lookahead_is ( "[" , i) {
323+ let mut vals = Vec :: new ( ) ;
324+ let open_pos = j;
325+
326+ loop {
327+ j = self . parse_ws ( j) ;
328+ if let Some ( end_pos) = self . lookahead_is ( "]" , j) {
329+ return Ok ( (
330+ Setting :: Array (
331+ vals,
332+ Span :: new ( i, open_pos) ,
333+ Span :: new ( j, end_pos) ,
334+ ) ,
335+ end_pos,
336+ ) ) ;
337+ }
338+ if let Ok ( ( val, k) ) = self . parse_setting ( j) {
339+ vals. push ( val) ;
340+ j = self . parse_ws ( k) ;
341+ }
342+ if let Some ( k) = self . lookahead_is ( "," , j) {
343+ j = k
344+ }
345+ }
346+ } else {
347+ let ( path_val, j) = self . parse_namespaced ( i) ?;
348+ i = self . parse_ws ( j) ;
349+ if let Some ( j) = self . lookahead_is ( "(" , i) {
350+ let ( arg, j) = self . parse_namespaced ( j) ?;
351+ i = self . parse_ws ( j) ;
352+ if let Some ( j) = self . lookahead_is ( ")" , i) {
353+ i = self . parse_ws ( j) ;
354+ Ok ( (
355+ Setting :: Constructor {
356+ ctor : path_val,
357+ arg,
358+ } ,
359+ i,
360+ ) )
361+ } else {
362+ Err ( HeaderError {
363+ kind : HeaderErrorKind :: ExpectedToken ( ')' ) ,
364+ locations : vec ! [ Span :: new( i, i) ] ,
365+ } )
366+ }
367+ } else {
368+ Ok ( ( Setting :: Unitary ( path_val) , i) )
369+ }
370+ }
371+ }
372+ } ,
373+ }
374+ }
375+
376+ pub fn parse_key_value (
299377 & ' _ self ,
300378 mut i : usize ,
301379 ) -> Result < ( String , Span , Value < Span > , usize ) , HeaderError < Span > > {
@@ -312,62 +390,8 @@ impl<'input> GrmtoolsSectionParser<'input> {
312390 let key_span = Span :: new ( i, j) ;
313391 i = self . parse_ws ( j) ;
314392 if let Some ( j) = self . lookahead_is ( ":" , i) {
315- i = self . parse_ws ( j) ;
316- match RE_DIGITS . find ( & self . src [ i..] ) {
317- Some ( m) => {
318- let num_span = Span :: new ( i + m. start ( ) , i + m. end ( ) ) ;
319- let num_str = & self . src [ num_span. start ( ) ..num_span. end ( ) ] ;
320- // If the above regex matches we expect this to succeed.
321- let num = str:: parse :: < u64 > ( num_str) . unwrap ( ) ;
322- let val = Setting :: Num ( num, num_span) ;
323- i = self . parse_ws ( num_span. end ( ) ) ;
324- Ok ( ( key_name, key_span, Value :: Setting ( val) , i) )
325- }
326- None => match RE_STRING . find ( & self . src [ i..] ) {
327- Some ( m) => {
328- let end = i + m. end ( ) ;
329- // Trim the leading and trailing quotes.
330- let str_span = Span :: new ( i + m. start ( ) + 1 , end - 1 ) ;
331- let str = & self . src [ str_span. start ( ) ..str_span. end ( ) ] ;
332- let setting = Setting :: String ( str. to_string ( ) , str_span) ;
333- // After the trailing quotes.
334- i = self . parse_ws ( end) ;
335- Ok ( ( key_name, key_span, Value :: Setting ( setting) , i) )
336- }
337- None => {
338- let ( path_val, j) = self . parse_namespaced ( i) ?;
339- i = self . parse_ws ( j) ;
340- if let Some ( j) = self . lookahead_is ( "(" , i) {
341- let ( arg, j) = self . parse_namespaced ( j) ?;
342- i = self . parse_ws ( j) ;
343- if let Some ( j) = self . lookahead_is ( ")" , i) {
344- i = self . parse_ws ( j) ;
345- Ok ( (
346- key_name,
347- key_span,
348- Value :: Setting ( Setting :: Constructor {
349- ctor : path_val,
350- arg,
351- } ) ,
352- i,
353- ) )
354- } else {
355- Err ( HeaderError {
356- kind : HeaderErrorKind :: ExpectedToken ( ')' ) ,
357- locations : vec ! [ Span :: new( i, i) ] ,
358- } )
359- }
360- } else {
361- Ok ( (
362- key_name,
363- key_span,
364- Value :: Setting ( Setting :: Unitary ( path_val) ) ,
365- i,
366- ) )
367- }
368- }
369- } ,
370- }
393+ let ( val, j) = self . parse_setting ( j) ?;
394+ Ok ( ( key_name, key_span, Value :: Setting ( val) , j) )
371395 } else {
372396 Ok ( ( key_name, key_span, Value :: Flag ( true , key_span) , i) )
373397 }
@@ -428,7 +452,7 @@ impl<'input> GrmtoolsSectionParser<'input> {
428452 if let Some ( j) = self . lookahead_is ( "{" , i) {
429453 i = self . parse_ws ( j) ;
430454 while self . lookahead_is ( "}" , i) . is_none ( ) && i < self . src . len ( ) {
431- let ( key, key_loc, val, j) = match self . parse_value ( i) {
455+ let ( key, key_loc, val, j) = match self . parse_key_value ( i) {
432456 Ok ( ( key, key_loc, val, pos) ) => ( key, key_loc, val, pos) ,
433457 Err ( e) => {
434458 errs. push ( e) ;
@@ -453,7 +477,7 @@ impl<'input> GrmtoolsSectionParser<'input> {
453477 i = self . parse_ws ( j) ;
454478 continue ;
455479 } else {
456- i = j ;
480+ i = self . parse_ws ( j ) ;
457481 break ;
458482 }
459483 }
0 commit comments