1
1
// HACK(eddyb) silence warnings from unused exports in the generated code.
2
2
#![ allow( unused) ]
3
+ #![ allow( non_camel_case_types) ]
3
4
4
5
// HACK(eddyb) needed for bootstrapping.
5
6
use crate as gll;
6
7
7
8
include ! ( concat!( env!( "OUT_DIR" ) , "/parse_grammar.rs" ) ) ;
8
9
10
+ use crate :: proc_macro:: { FlatToken , Span , TokenStream } ;
9
11
use crate :: runtime;
10
12
use crate :: scannerless:: Pat as SPat ;
11
13
use std:: ops:: Bound ;
12
14
use std:: str:: FromStr ;
13
15
14
- impl < Pat : From < SPat > > FromStr for crate :: scannerless:: WrapperHack < grammer:: Grammar < Pat > > {
15
- type Err = runtime:: ParseError < runtime:: LineColumn > ;
16
- fn from_str ( src : & str ) -> Result < Self , Self :: Err > {
17
- let mut grammar = grammer:: Grammar :: new ( ) ;
18
- Grammar :: parse ( src) ?. with ( |g| {
19
- for rule_def in g. one ( ) . unwrap ( ) . rules {
20
- let rule_def = rule_def. unwrap ( ) . one ( ) . unwrap ( ) ;
21
- grammar. define ( rule_def. name . source ( ) , rule_def. rule . one ( ) . unwrap ( ) . lower ( ) ) ;
22
- }
23
- } ) ;
24
- Ok ( crate :: scannerless:: WrapperHack ( grammar) )
25
- }
16
+ pub fn parse_grammar < Pat : From < SPat > > (
17
+ stream : TokenStream ,
18
+ ) -> Result < grammer:: Grammar < Pat > , runtime:: ParseError < Span > > {
19
+ let mut grammar = grammer:: Grammar :: new ( ) ;
20
+ Grammar :: parse ( stream) ?. with ( |g| {
21
+ for rule_def in g. one ( ) . unwrap ( ) . rules {
22
+ let rule_def = rule_def. unwrap ( ) . one ( ) . unwrap ( ) ;
23
+ let name = match rule_def. name . source ( ) {
24
+ [ FlatToken :: Ident ( ident) ] => ident. to_string ( ) ,
25
+ _ => unreachable ! ( ) ,
26
+ } ;
27
+ grammar. define ( & name, rule_def. rule . one ( ) . unwrap ( ) . lower ( ) ) ;
28
+ }
29
+ } ) ;
30
+ Ok ( grammar)
26
31
}
27
32
28
- impl Or < ' _ , ' _ , & str > {
33
+ impl Or < ' _ , ' _ , TokenStream > {
29
34
fn lower < Pat : From < SPat > > ( self ) -> grammer:: RuleWithNamedFields < Pat > {
30
35
let mut rules = self . rules . map ( |rule| rule. unwrap ( ) . one ( ) . unwrap ( ) . lower ( ) ) ;
31
36
let first = rules. next ( ) . unwrap ( ) ;
32
37
rules. fold ( first, |a, b| a | b)
33
38
}
34
39
}
35
40
36
- impl Concat < ' _ , ' _ , & str > {
41
+ impl Concat < ' _ , ' _ , TokenStream > {
37
42
fn lower < Pat : From < SPat > > ( self ) -> grammer:: RuleWithNamedFields < Pat > {
38
43
self . rules
39
44
. map ( |rule| rule. unwrap ( ) . one ( ) . unwrap ( ) . lower ( ) )
40
45
. fold ( grammer:: empty ( ) , |a, b| a + b)
41
46
}
42
47
}
43
48
44
- impl Rule < ' _ , ' _ , & str > {
49
+ impl Rule < ' _ , ' _ , TokenStream > {
45
50
fn lower < Pat : From < SPat > > ( self ) -> grammer:: RuleWithNamedFields < Pat > {
46
51
let mut rule = self . rule . one ( ) . unwrap ( ) . lower ( ) ;
47
52
if let Some ( modifier) = self . modifier {
48
53
rule = modifier. one ( ) . unwrap ( ) . lower ( rule) ;
49
54
}
50
55
if let Some ( field) = self . field {
51
- rule = rule. field ( field. source ( ) ) ;
56
+ let field = match field. source ( ) {
57
+ [ FlatToken :: Ident ( ident) ] => ident. to_string ( ) ,
58
+ _ => unreachable ! ( ) ,
59
+ } ;
60
+ rule = rule. field ( & field) ;
52
61
}
53
62
rule
54
63
}
55
64
}
56
65
57
- impl Primary < ' _ , ' _ , & str > {
66
+ impl Primary < ' _ , ' _ , TokenStream > {
58
67
fn lower < Pat : From < SPat > > ( self ) -> grammer:: RuleWithNamedFields < Pat > {
59
68
match self {
60
69
Primary :: Eat ( pat) => grammer:: eat ( pat. one ( ) . unwrap ( ) . lower ( ) ) ,
61
- Primary :: NegativeLookahead { pat } => {
62
- grammer:: negative_lookahead ( pat. one ( ) . unwrap ( ) . lower ( ) )
70
+ Primary :: Call ( name) => {
71
+ let name = match name. source ( ) {
72
+ [ FlatToken :: Ident ( ident) ] => ident. to_string ( ) ,
73
+ _ => unreachable ! ( ) ,
74
+ } ;
75
+ grammer:: call ( & name)
63
76
}
64
- Primary :: Call ( name) => grammer:: call ( name. source ( ) ) ,
65
77
Primary :: Group { or } => or. map_or_else ( grammer:: empty, |or| or. one ( ) . unwrap ( ) . lower ( ) ) ,
66
78
}
67
79
}
68
80
}
69
81
70
- impl Modifier < ' _ , ' _ , & str > {
82
+ impl Modifier < ' _ , ' _ , TokenStream > {
71
83
fn lower < Pat : From < SPat > > (
72
84
self ,
73
85
rule : grammer:: RuleWithNamedFields < Pat > ,
@@ -90,7 +102,7 @@ impl Modifier<'_, '_, &str> {
90
102
}
91
103
}
92
104
93
- impl SepKind < ' _ , ' _ , & str > {
105
+ impl SepKind < ' _ , ' _ , TokenStream > {
94
106
fn lower ( & self ) -> grammer:: SepKind {
95
107
match self {
96
108
SepKind :: Simple ( _) => grammer:: SepKind :: Simple ,
@@ -99,11 +111,14 @@ impl SepKind<'_, '_, &str> {
99
111
}
100
112
}
101
113
102
- impl Pattern < ' _ , ' _ , & str > {
114
+ impl Pattern < ' _ , ' _ , TokenStream > {
103
115
fn lower ( self ) -> SPat {
104
- fn unescape < T > ( handle : Handle < ' _ , ' _ , & str , T > ) -> String {
116
+ fn unescape < T > ( handle : Handle < ' _ , ' _ , TokenStream , T > ) -> String {
105
117
let mut out = String :: new ( ) ;
106
- let s = handle. source ( ) ;
118
+ let s = match handle. source ( ) {
119
+ [ FlatToken :: Literal ( lit) ] => lit. to_string ( ) ,
120
+ _ => unreachable ! ( ) ,
121
+ } ;
107
122
let mut chars = s[ 1 ..s. len ( ) - 1 ] . chars ( ) ;
108
123
while let Some ( c) = chars. next ( ) {
109
124
let c = match c {
0 commit comments