diff options
Diffstat (limited to 'src/parser/mod.rs')
-rw-r--r-- | src/parser/mod.rs | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/src/parser/mod.rs b/src/parser/mod.rs index ccccd78f9..a632fbc01 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs | |||
@@ -8,17 +8,50 @@ use self::event_parser::Event; | |||
8 | 8 | ||
9 | pub fn parse(text: String, tokens: &[Token]) -> File { | 9 | pub fn parse(text: String, tokens: &[Token]) -> File { |
10 | let events = event_parser::parse(&text, tokens); | 10 | let events = event_parser::parse(&text, tokens); |
11 | from_events_to_file(text, events) | 11 | from_events_to_file(text, tokens, events) |
12 | } | 12 | } |
13 | 13 | ||
14 | fn from_events_to_file(text: String, events: Vec<Event>) -> File { | 14 | fn from_events_to_file( |
15 | text: String, | ||
16 | tokens: &[Token], | ||
17 | events: Vec<Event>, | ||
18 | ) -> File { | ||
15 | let mut builder = FileBuilder::new(text); | 19 | let mut builder = FileBuilder::new(text); |
20 | let mut idx = 0; | ||
16 | for event in events { | 21 | for event in events { |
17 | match event { | 22 | match event { |
18 | Event::Start { kind } => builder.start_internal(kind), | 23 | Event::Start { kind } => builder.start_internal(kind), |
19 | Event::Finish => builder.finish_internal(), | 24 | Event::Finish => { |
20 | Event::Token { .. } => unimplemented!(), | 25 | while idx < tokens.len() { |
26 | let token = tokens[idx]; | ||
27 | if is_insignificant(token.kind) { | ||
28 | idx += 1; | ||
29 | builder.leaf(token.kind, token.len); | ||
30 | } else { | ||
31 | break; | ||
32 | } | ||
33 | } | ||
34 | builder.finish_internal() | ||
35 | }, | ||
36 | Event::Token { kind, mut n_raw_tokens } => loop { | ||
37 | let token = tokens[idx]; | ||
38 | if !is_insignificant(token.kind) { | ||
39 | n_raw_tokens -= 1; | ||
40 | } | ||
41 | idx += 1; | ||
42 | builder.leaf(token.kind, token.len); | ||
43 | if n_raw_tokens == 0 { | ||
44 | break; | ||
45 | } | ||
46 | }, | ||
21 | } | 47 | } |
22 | } | 48 | } |
23 | builder.finish() | 49 | builder.finish() |
24 | } | 50 | } |
51 | |||
52 | fn is_insignificant(kind: SyntaxKind) -> bool { | ||
53 | match kind { | ||
54 | WHITESPACE | COMMENT => true, | ||
55 | _ => false, | ||
56 | } | ||
57 | } \ No newline at end of file | ||