@@ -382,34 +382,46 @@ impl YaccParser {
382382 update_yacc_kind : bool ,
383383 ) -> Result < usize , YaccGrammarError > {
384384 // Compares haystack converted to lowercase to needle (assumed to be lowercase).
385- fn starts_with_lower ( needle : & ' static str , haystack : & ' _ str ) -> bool {
385+ fn starts_with_lower ( needle : & ' _ str , haystack : & ' _ str ) -> bool {
386386 if let Some ( ( prefix, _) ) = haystack. split_at_checked ( needle. len ( ) ) {
387387 prefix. to_lowercase ( ) == needle
388388 } else {
389389 false
390390 }
391391 }
392+ const ACTION_KINDS : [ ( & str , YaccOriginalActionKind ) ; 3 ] = [
393+ ( "noaction" , YaccOriginalActionKind :: NoAction ) ,
394+ ( "useraction" , YaccOriginalActionKind :: UserAction ) ,
395+ ( "genericparsetree" , YaccOriginalActionKind :: GenericParseTree ) ,
396+ ] ;
392397
393- const YACC_KINDS : [ ( & str , YaccKind ) ; 5 ] = [
394- ( "grmtools" , YaccKind :: Grmtools ) ,
395- (
396- "original(noaction)" ,
397- YaccKind :: Original ( YaccOriginalActionKind :: NoAction ) ,
398- ) ,
399- (
400- "original(useraction)" ,
401- YaccKind :: Original ( YaccOriginalActionKind :: UserAction ) ,
402- ) ,
403- (
404- "original(genericparsetree)" ,
405- YaccKind :: Original ( YaccOriginalActionKind :: GenericParseTree ) ,
406- ) ,
407- ( "Eco" , YaccKind :: Eco ) ,
398+ let mut yacc_kinds = vec ! [
399+ ( "grmtools" . to_string( ) , YaccKind :: Grmtools ) ,
400+ ( "yacckind::grmtools" . to_string( ) , YaccKind :: Grmtools ) ,
401+ ( "Eco" . to_string( ) , YaccKind :: Eco ) ,
402+ ( "yackind::Eco" . to_string( ) , YaccKind :: Eco ) ,
408403 ] ;
404+ for ( name, action_kind) in ACTION_KINDS {
405+ let yk = "YaccKind" . to_lowercase ( ) ;
406+ let ak = "YaccOriginalActionKind" . to_lowercase ( ) ;
407+ yacc_kinds. push ( ( format ! ( "original({name})" ) , YaccKind :: Original ( action_kind) ) ) ;
408+ yacc_kinds. push ( (
409+ format ! ( "{yk}::original({name})" ) ,
410+ YaccKind :: Original ( action_kind) ,
411+ ) ) ;
412+ yacc_kinds. push ( (
413+ format ! ( "{yk}::original({ak}::{name})" ) ,
414+ YaccKind :: Original ( action_kind) ,
415+ ) ) ;
416+ yacc_kinds. push ( (
417+ format ! ( "original({ak}::{name})" ) ,
418+ YaccKind :: Original ( action_kind) ,
419+ ) ) ;
420+ }
409421 let j = self . parse_ws ( i, false ) ?;
410422 let s = & self . src [ i..] ;
411- for ( kind_name, kind) in YACC_KINDS {
412- if starts_with_lower ( kind_name, s) {
423+ for ( kind_name, kind) in yacc_kinds {
424+ if starts_with_lower ( & kind_name, s) {
413425 if update_yacc_kind {
414426 self . yacc_kind = Some ( kind) ;
415427 }
@@ -2764,4 +2776,31 @@ B";
27642776 " ;
27652777 parse ( YaccKind :: Original ( YaccOriginalActionKind :: NoAction ) , src) . unwrap ( ) ;
27662778 }
2779+
2780+ #[ test]
2781+ fn test_grmtools_section_yacckinds ( ) {
2782+ let srcs = [
2783+ "%grmtools{yacckind Original(NoAction)}
2784+ %%
2785+ Start: ;" ,
2786+ "%grmtools{yacckind YaccKind::Original(GenericParseTree)}
2787+ %%
2788+ Start: ;" ,
2789+ "%grmtools{yacckind YaccKind::Original(yaccoriginalactionkind::useraction)}
2790+ %actiontype ()
2791+ %%
2792+ Start: ;" ,
2793+ "%grmtools{yacckind Original(YACCOriginalActionKind::NoAction)}
2794+ %%
2795+ Start: ;" ,
2796+ "%grmtools{yacckind YaccKind::Grmtools}
2797+ %%
2798+ Start -> () : ;" ,
2799+ ] ;
2800+ for src in srcs {
2801+ YaccParser :: new ( YaccKindResolver :: NoDefault , src. to_string ( ) )
2802+ . parse ( )
2803+ . unwrap ( ) ;
2804+ }
2805+ }
27672806}
0 commit comments