@@ -12,11 +12,18 @@ where
1212 type TokenSet : TokenSet < ' a > ;
1313
1414 fn into_iter ( ) -> impl Iterator < Item = Self > ;
15- fn into_rule ( & self ) -> Rule < ' a , Self :: TokenSet > ;
15+ fn into_rules ( & self ) -> Vec < Rule < ' a , Self :: TokenSet > > ;
1616
1717 fn into_ruleset ( ) -> RuleSet < ' a , Self :: TokenSet > {
1818 let rules = Self :: into_iter ( )
19- . map ( |elem| Self :: into_rule ( & elem) )
19+ . enumerate ( )
20+ . flat_map ( |( idx, elem) | {
21+ let mut rules = Self :: into_rules ( & elem) ;
22+ for rule in & mut rules {
23+ rule. id = idx;
24+ }
25+ rules
26+ } )
2027 . collect :: < Vec < _ > > ( ) ;
2128
2229 RuleSet :: from ( rules)
@@ -110,16 +117,12 @@ pub struct RuleSet<'a, T: TokenSet<'a>> {
110117}
111118
112119impl < ' a , T : TokenSet < ' a > > From < Vec < Rule < ' a , T > > > for RuleSet < ' a , T > {
113- fn from ( mut rules : Vec < Rule < ' a , T > > ) -> Self {
120+ fn from ( rules : Vec < Rule < ' a , T > > ) -> Self {
114121 let top = match & rules[ 0 ] . lhs {
115122 RuleElem :: NonTerm ( s) => s. clone ( ) ,
116123 _ => unreachable ! ( ) ,
117124 } ;
118125
119- for ( idx, rule) in rules. iter_mut ( ) . enumerate ( ) {
120- rule. id = idx;
121- }
122-
123126 RuleSet {
124127 top,
125128 rules,
@@ -307,7 +310,7 @@ mod test {
307310 )
308311 }
309312
310- fn into_rule ( & self ) -> Rule < ' a , Self :: TokenSet > {
313+ fn into_rules ( & self ) -> Vec < Rule < ' a , Self :: TokenSet > > {
311314 let expr_plus = Rule :: from ( (
312315 RuleElem :: new_nonterm ( "expr" ) ,
313316 vec ! [
@@ -366,14 +369,14 @@ mod test {
366369 let fact_2_num = Rule :: from ( ( RuleElem :: new_nonterm ( "fact" ) , vec ! [ ] ) ) ;
367370
368371 match self {
369- TestSyntax :: ExprPlus => expr_plus,
370- TestSyntax :: ExprMinus => expr_minus,
371- TestSyntax :: Expr2Term => expr_2_term,
372- TestSyntax :: TermMul => term_mul,
373- TestSyntax :: TermDiv => term_div,
374- TestSyntax :: Term2Fact => term_2_fact,
375- TestSyntax :: Fact2Expr => fact_2_expr,
376- TestSyntax :: Fact2Num => fact_2_num,
372+ TestSyntax :: ExprPlus => vec ! [ expr_plus] ,
373+ TestSyntax :: ExprMinus => vec ! [ expr_minus] ,
374+ TestSyntax :: Expr2Term => vec ! [ expr_2_term] ,
375+ TestSyntax :: TermMul => vec ! [ term_mul] ,
376+ TestSyntax :: TermDiv => vec ! [ term_div] ,
377+ TestSyntax :: Term2Fact => vec ! [ term_2_fact] ,
378+ TestSyntax :: Fact2Expr => vec ! [ fact_2_expr] ,
379+ TestSyntax :: Fact2Num => vec ! [ fact_2_num] ,
377380 }
378381 }
379382 }
0 commit comments