diff options
Diffstat (limited to 'src/parser')
-rw-r--r-- | src/parser/event_parser/grammar.rs | 6 | ||||
-rw-r--r-- | src/parser/event_parser/mod.rs | 1 | ||||
-rw-r--r-- | src/parser/event_parser/parser.rs | 22 | ||||
-rw-r--r-- | src/parser/mod.rs | 41 |
4 files changed, 60 insertions, 10 deletions
diff --git a/src/parser/event_parser/grammar.rs b/src/parser/event_parser/grammar.rs index 5219ed535..0896506fb 100644 --- a/src/parser/event_parser/grammar.rs +++ b/src/parser/event_parser/grammar.rs | |||
@@ -40,6 +40,12 @@ fn mod_items(p: &mut Parser) { | |||
40 | fn item(p: &mut Parser) -> Result { | 40 | fn item(p: &mut Parser) -> Result { |
41 | outer_attributes(p)?; | 41 | outer_attributes(p)?; |
42 | visibility(p)?; | 42 | visibility(p)?; |
43 | if p.current_is(STRUCT_KW) { | ||
44 | p.start(STRUCT_ITEM); | ||
45 | p.bump(); | ||
46 | p.finish(); | ||
47 | return OK; | ||
48 | } | ||
43 | ERR | 49 | ERR |
44 | } | 50 | } |
45 | 51 | ||
diff --git a/src/parser/event_parser/mod.rs b/src/parser/event_parser/mod.rs index bdfd23974..1228236a9 100644 --- a/src/parser/event_parser/mod.rs +++ b/src/parser/event_parser/mod.rs | |||
@@ -4,6 +4,7 @@ use syntax_kinds::*; | |||
4 | mod grammar; | 4 | mod grammar; |
5 | mod parser; | 5 | mod parser; |
6 | 6 | ||
7 | #[derive(Debug)] | ||
7 | pub(crate) enum Event { | 8 | pub(crate) enum Event { |
8 | Start { kind: SyntaxKind }, | 9 | Start { kind: SyntaxKind }, |
9 | Finish, | 10 | Finish, |
diff --git a/src/parser/event_parser/parser.rs b/src/parser/event_parser/parser.rs index 0e4d44b79..2d5418a29 100644 --- a/src/parser/event_parser/parser.rs +++ b/src/parser/event_parser/parser.rs | |||
@@ -1,5 +1,6 @@ | |||
1 | use {Token, SyntaxKind, TextUnit}; | 1 | use {Token, SyntaxKind, TextUnit}; |
2 | use super::Event; | 2 | use super::{Event}; |
3 | use super::super::is_insignificant; | ||
3 | use syntax_kinds::{WHITESPACE, COMMENT}; | 4 | use syntax_kinds::{WHITESPACE, COMMENT}; |
4 | 5 | ||
5 | pub struct Parser<'t> { | 6 | pub struct Parser<'t> { |
@@ -16,9 +17,8 @@ impl<'t> Parser<'t> { | |||
16 | let mut non_ws_tokens = Vec::new(); | 17 | let mut non_ws_tokens = Vec::new(); |
17 | let mut len = TextUnit::new(0); | 18 | let mut len = TextUnit::new(0); |
18 | for (idx, &token) in raw_tokens.iter().enumerate() { | 19 | for (idx, &token) in raw_tokens.iter().enumerate() { |
19 | match token.kind { | 20 | if !is_insignificant(token.kind) { |
20 | WHITESPACE | COMMENT => (), | 21 | non_ws_tokens.push((idx, len)) |
21 | _ => non_ws_tokens.push((idx, len)), | ||
22 | } | 22 | } |
23 | len += token.len; | 23 | len += token.len; |
24 | } | 24 | } |
@@ -50,15 +50,25 @@ impl<'t> Parser<'t> { | |||
50 | self.event(Event::Finish); | 50 | self.event(Event::Finish); |
51 | } | 51 | } |
52 | 52 | ||
53 | pub(crate) fn bump(&mut self) -> Option<SyntaxKind> { | 53 | pub(crate) fn current(&self) -> Option<SyntaxKind> { |
54 | if self.is_eof() { | 54 | if self.is_eof() { |
55 | return None; | 55 | return None; |
56 | } | 56 | } |
57 | let idx = self.non_ws_tokens[self.pos].0; | 57 | let idx = self.non_ws_tokens[self.pos].0; |
58 | self.pos += 1; | ||
59 | Some(self.raw_tokens[idx].kind) | 58 | Some(self.raw_tokens[idx].kind) |
60 | } | 59 | } |
61 | 60 | ||
61 | pub(crate) fn current_is(&self, kind: SyntaxKind) -> bool { | ||
62 | self.current() == Some(kind) | ||
63 | } | ||
64 | |||
65 | pub(crate) fn bump(&mut self) -> Option<SyntaxKind> { | ||
66 | let kind = self.current()?; | ||
67 | self.pos += 1; | ||
68 | self.event(Event::Token { kind, n_raw_tokens: 1 }); | ||
69 | Some(kind) | ||
70 | } | ||
71 | |||
62 | fn event(&mut self, event: Event) { | 72 | fn event(&mut self, event: Event) { |
63 | self.events.push(event) | 73 | self.events.push(event) |
64 | } | 74 | } |
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 | ||