@@ -7,17 +7,26 @@ use super::token::TokenSet;
77
88pub trait Syntax < ' a >
99where
10- Self : Debug + Clone + Copy + Sized ,
10+ Self : Debug + Clone + Copy ,
1111{
1212 type TokenSet : TokenSet < ' a > ;
1313
14- fn enum_iter ( ) -> impl Iterator < Item = Self > ;
15- fn to_rule ( & self ) -> Rule < ' a , Self :: TokenSet > ;
14+ fn into_iter ( ) -> impl Iterator < Item = Self > ;
15+ fn into_rules ( & self ) -> Vec < Rule < ' a , Self :: TokenSet > > ;
1616
17- fn try_into ( ) -> anyhow:: Result < Vec < ( Rule < ' a , Self :: TokenSet > , Self ) > > {
18- Self :: enum_iter ( )
19- . map ( |elem| Ok ( ( Self :: to_rule ( & elem) , elem) ) )
20- . collect :: < anyhow:: Result < Vec < _ > > > ( )
17+ fn into_ruleset ( ) -> RuleSet < ' a , Self :: TokenSet > {
18+ let rules = Self :: into_iter ( )
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+ } )
27+ . collect :: < Vec < _ > > ( ) ;
28+
29+ RuleSet :: from ( rules)
2130 }
2231}
2332
@@ -108,16 +117,12 @@ pub struct RuleSet<'a, T: TokenSet<'a>> {
108117}
109118
110119impl < ' a , T : TokenSet < ' a > > From < Vec < Rule < ' a , T > > > for RuleSet < ' a , T > {
111- fn from ( mut rules : Vec < Rule < ' a , T > > ) -> Self {
120+ fn from ( rules : Vec < Rule < ' a , T > > ) -> Self {
112121 let top = match & rules[ 0 ] . lhs {
113122 RuleElem :: NonTerm ( s) => s. clone ( ) ,
114123 _ => unreachable ! ( ) ,
115124 } ;
116125
117- for ( idx, rule) in rules. iter_mut ( ) . enumerate ( ) {
118- rule. id = idx;
119- }
120-
121126 RuleSet {
122127 top,
123128 rules,
@@ -228,7 +233,7 @@ impl<'a, T: TokenSet<'a>> RuleSet<'a, T> {
228233mod test {
229234 use std:: collections:: HashMap ;
230235
231- use super :: { TokenSet , Syntax , Rule , RuleElem , RuleSet } ;
236+ use super :: { TokenSet , Syntax , Rule , RuleElem } ;
232237
233238 #[ derive( Clone , Copy , Hash , PartialEq , Eq , Debug ) ]
234239 enum TestToken {
@@ -242,7 +247,7 @@ mod test {
242247 }
243248
244249 impl TokenSet < ' _ > for TestToken {
245- fn enum_iter ( ) -> impl Iterator < Item = Self > {
250+ fn into_iter ( ) -> impl Iterator < Item = Self > {
246251 Box :: new (
247252 vec ! [
248253 TestToken :: Num ,
@@ -257,7 +262,7 @@ mod test {
257262 )
258263 }
259264
260- fn to_regex ( & self ) -> & ' static str {
265+ fn into_regex_str ( & self ) -> & ' static str {
261266 match self {
262267 TestToken :: Num => r"^[1-9][0-9]*" ,
263268 TestToken :: Plus => r"^\+" ,
@@ -289,7 +294,7 @@ mod test {
289294 impl < ' a > Syntax < ' a > for TestSyntax {
290295 type TokenSet = TestToken ;
291296
292- fn enum_iter ( ) -> impl Iterator < Item = Self > {
297+ fn into_iter ( ) -> impl Iterator < Item = Self > {
293298 Box :: new (
294299 vec ! [
295300 TestSyntax :: ExprPlus ,
@@ -305,7 +310,7 @@ mod test {
305310 )
306311 }
307312
308- fn to_rule ( & self ) -> Rule < ' a , Self :: TokenSet > {
313+ fn into_rules ( & self ) -> Vec < Rule < ' a , Self :: TokenSet > > {
309314 let expr_plus = Rule :: from ( (
310315 RuleElem :: new_nonterm ( "expr" ) ,
311316 vec ! [
@@ -364,14 +369,14 @@ mod test {
364369 let fact_2_num = Rule :: from ( ( RuleElem :: new_nonterm ( "fact" ) , vec ! [ ] ) ) ;
365370
366371 match self {
367- TestSyntax :: ExprPlus => expr_plus,
368- TestSyntax :: ExprMinus => expr_minus,
369- TestSyntax :: Expr2Term => expr_2_term,
370- TestSyntax :: TermMul => term_mul,
371- TestSyntax :: TermDiv => term_div,
372- TestSyntax :: Term2Fact => term_2_fact,
373- TestSyntax :: Fact2Expr => fact_2_expr,
374- 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] ,
375380 }
376381 }
377382 }
@@ -399,12 +404,7 @@ mod test {
399404
400405 #[ test]
401406 fn first_set ( ) {
402- let rules = <TestSyntax as Syntax >:: try_into ( )
403- . unwrap ( )
404- . into_iter ( )
405- . map ( |( rule, _) | rule)
406- . collect :: < Vec < _ > > ( ) ;
407- let ruleset = RuleSet :: from ( rules) ;
407+ let ruleset = <TestSyntax as Syntax >:: into_ruleset ( ) ;
408408 let first_set = ruleset. first_set ( ) ;
409409
410410 check (
0 commit comments