@@ -221,8 +221,6 @@ impl fmt::Display for CodeLabel {
221
221
222
222
#[ derive( Default ) ]
223
223
pub struct Options {
224
- /// Enable the use of unstable features, such as generators.
225
- pub unstable : bool ,
226
224
/// Disable generating macros (e.g. `P!(...)` sugar for `_P::...`).
227
225
pub no_macros : bool ,
228
226
@@ -247,34 +245,13 @@ impl<Pat: Ord + Hash + MatchesEmpty + RustInputPat> Grammar<Pat> {
247
245
let mut code_labels = OrderMap :: new ( ) ;
248
246
249
247
put ! ( "
250
- use gll::runtime::{Call, Continuation, ParseNodeKind, CodeLabel, ParseNodeShape, ParseNode, Range, traverse};
248
+ use gll::runtime::{Call, Continuation, ParseNodeKind, CodeLabel, ParseNodeShape, ParseNode, Range, traverse, nd::Arrow };
251
249
use std::any;
252
250
use std::fmt;
253
251
use std::marker::PhantomData;" ) ;
254
- if options. unstable {
255
- put ! ( "
256
- use std::ops::{GeneratorState, Generator};
257
- " ) ;
258
- }
259
252
// HACK(eddyb) see `out += out_body` at the end
260
253
let out_imports = mem:: replace ( & mut out, String :: new ( ) ) ;
261
254
262
- if options. unstable {
263
- put ! ( "
264
- struct GenIter<G>(G);
265
-
266
- impl<G: Generator<Return = ()>> Iterator for GenIter<G> {
267
- type Item = G::Yield;
268
-
269
- fn next(&mut self) -> Option<Self::Item> {
270
- match unsafe { self.0.resume() } {
271
- GeneratorState::Complete(..) => None,
272
- GeneratorState::Yielded(v) => Some(v),
273
- }
274
- }
275
- }
276
- " ) ;
277
- }
278
255
put ! ( "
279
256
#[derive(Debug)]
280
257
pub enum ParseError<T> {
@@ -621,13 +598,14 @@ impl<'a, 'i, I: ::gll::runtime::Input> fmt::Debug for Handle<'a, 'i, I, ", name,
621
598
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
622
599
write!(f, \" {:?} => \" , self.source_info())?;
623
600
let mut first = true;
624
- self.try_for_each(|x| {
601
+ for x in self.all() {
625
602
if !first {
626
603
write!(f, \" | \" )?;
627
604
}
628
605
first = false;
629
- fmt::Debug::fmt(&x, f)
630
- })
606
+ fmt::Debug::fmt(&x, f)?;
607
+ }
608
+ Ok(())
631
609
}
632
610
}
633
611
@@ -761,76 +739,51 @@ impl<'a, 'i, I: ::gll::runtime::Input> Handle<'a, 'i, I, ", name, "<'a, 'i, I>>
761
739
}
762
740
put ! ( "
763
741
}))().map_err(|::gll::runtime::MoreThanOne| Ambiguity(self))
764
- }" ) ;
765
- if options. unstable {
766
- put ! ( "
742
+ }
767
743
pub fn all(self) -> impl Iterator<Item = " , name, "<'a, 'i, I>> {
768
744
let sppf = &self.parser.sppf;
769
- GenIter(move || {
770
- let node = self.node.unpack_alias();" ) ;
745
+ let node = self.node.unpack_alias();" ) ;
771
746
if let Some ( variants) = & variants {
772
747
put ! ( "
773
- for node in sppf.all_choices(node) {
774
- match node.kind {" ) ;
775
- for ( rule, variant, _) in variants {
748
+ #[derive(Clone)]
749
+ enum Iter<" ) ; for i in 0 ..variants. len ( ) { put ! ( "_" , i, "," ) ; } put ! ( "> {
750
+ " ) ; for i in 0 ..variants. len ( ) { put ! ( "_" , i, "(_" , i, ")," ) ; } put ! ( "
751
+ }
752
+ impl<T, " ) ; for i in 0 ..variants. len ( ) { put ! ( "_" , i, ": Iterator<Item = T>," ) ; } put ! ( "> Iterator
753
+ for Iter<" ) ; for i in 0 ..variants. len ( ) { put ! ( "_" , i, "," ) ; } put ! ( ">
754
+ {
755
+ type Item = T;
756
+ fn next(&mut self) -> Option<T> {
757
+ match self {" ) ;
758
+ for i in 0 ..variants. len ( ) {
776
759
put ! ( "
777
- " , rule. parse_node_kind( & parse_nodes) , " => {
778
- traverse!(all(sppf, node) " , rule. generate_traverse_shape( false , & parse_nodes) , ",
779
- r => yield " , name, "::" , variant, "_from_sppf(self.parser, node, r));
780
- }" ) ;
760
+ Iter::_" , i, "(iter) => iter.next()," ) ;
781
761
}
782
762
put ! ( "
783
- _ => unreachable!(),
784
- }
785
- }" ) ;
786
- } else {
787
- put ! ( "
788
- traverse!(all(sppf, node) " , rule. rule. generate_traverse_shape( false , & parse_nodes) , ",
789
- r => yield " , name, "::from_sppf(self.parser, node, r));" ) ;
790
763
}
791
- put ! ( "
792
- })
793
- }" ) ;
794
764
}
795
- put ! ( "
796
- pub fn for_each(self, mut f: impl FnMut(" , name, "<'a, 'i, I>)) {
797
- let sppf = &self.parser.sppf;
798
- let node = self.node.unpack_alias();" ) ;
799
- if let Some ( variants) = & variants {
800
- put ! ( "
801
- for node in sppf.all_choices(node) {
765
+ }
766
+ sppf.all_choices(node).flat_map(move |node| {
802
767
match node.kind {" ) ;
803
- for ( rule, variant, _) in variants {
768
+ for ( i, ( rule, variant, _) ) in variants. iter ( ) . enumerate ( ) {
769
+ put ! ( "
770
+ " , rule. parse_node_kind( & parse_nodes) , " => Iter::_" , i, "(
771
+ traverse!(all(sppf) " , rule. generate_traverse_shape( false , & parse_nodes) , ")
772
+ .apply(node)
773
+ .map(move |r| " , name, "::" , variant, "_from_sppf(self.parser, node, r))
774
+ )," ) ;
775
+ }
804
776
put ! ( "
805
- " , rule. parse_node_kind( & parse_nodes) , " => {
806
- traverse!(all(sppf, node) " , rule. generate_traverse_shape( false , & parse_nodes) , ",
807
- r => f(" , name, "::" , variant, "_from_sppf(self.parser, node, r)));
808
- }" ) ;
809
- }
810
- put ! ( "
811
777
_ => unreachable!(),
812
778
}
813
- }" ) ;
814
- } else {
779
+ })" ) ;
780
+ } else {
781
+ put ! ( "
782
+ traverse!(all(sppf) " , rule. rule. generate_traverse_shape( false , & parse_nodes) , ")
783
+ .apply(node)
784
+ .map(move |r| " , name, "::from_sppf(self.parser, node, r))" ) ;
785
+ }
815
786
put ! ( "
816
- traverse!(all(sppf, node) " , rule. rule. generate_traverse_shape( false , & parse_nodes) , ",
817
- r => f(" , name, "::from_sppf(self.parser, node, r)));" ) ;
818
- }
819
- put ! ( "
820
- }
821
- pub fn try_for_each<E>(
822
- self,
823
- mut f: impl FnMut(" , name, "<'a, 'i, I>) -> Result<(), E>,
824
- ) -> Result<(), E> {
825
- let mut r = Ok(());
826
- self.for_each(|x| {
827
- // FIXME(eddyb) this should stop the iteration early
828
- if r.is_err() {
829
- return;
830
- }
831
- r = f(x);
832
- });
833
- r
834
787
}
835
788
}" ) ;
836
789
}
@@ -1523,7 +1476,8 @@ impl<Pat: Ord + Hash + RustInputPat> Rule<Pat> {
1523
1476
for ( i, rule) in rules. iter ( ) . enumerate ( ) {
1524
1477
write ! (
1525
1478
s,
1526
- "{}: {} => {}," ,
1479
+ "{} _{}: {} => {}," ,
1480
+ i,
1527
1481
i,
1528
1482
rule. parse_node_kind( parse_nodes) ,
1529
1483
rule. generate_traverse_shape( true , parse_nodes)
0 commit comments