diff options
Diffstat (limited to 'src/parser/event_parser/parser.rs')
-rw-r--r-- | src/parser/event_parser/parser.rs | 35 |
1 files changed, 15 insertions, 20 deletions
diff --git a/src/parser/event_parser/parser.rs b/src/parser/event_parser/parser.rs index f0d1d358b..bec9dbab4 100644 --- a/src/parser/event_parser/parser.rs +++ b/src/parser/event_parser/parser.rs | |||
@@ -2,8 +2,7 @@ use {Token, SyntaxKind, TextUnit}; | |||
2 | use super::{Event}; | 2 | use super::{Event}; |
3 | use super::super::is_insignificant; | 3 | use super::super::is_insignificant; |
4 | use syntax_kinds::{L_CURLY, R_CURLY, ERROR}; | 4 | use syntax_kinds::{L_CURLY, R_CURLY, ERROR}; |
5 | 5 | use tree::EOF; | |
6 | pub(crate) const EOF: SyntaxKind = SyntaxKind(10000); | ||
7 | 6 | ||
8 | 7 | ||
9 | pub(crate) struct Parser<'t> { | 8 | pub(crate) struct Parser<'t> { |
@@ -46,19 +45,22 @@ impl<'t> Parser<'t> { | |||
46 | } | 45 | } |
47 | 46 | ||
48 | pub(crate) fn into_events(self) -> Vec<Event> { | 47 | pub(crate) fn into_events(self) -> Vec<Event> { |
49 | assert!(self.is_eof()); | 48 | assert!(self.curly_limit.is_none()); |
49 | assert!(self.current() == EOF); | ||
50 | self.events | 50 | self.events |
51 | } | 51 | } |
52 | 52 | ||
53 | pub(crate) fn is_eof(&self) -> bool { | 53 | pub(crate) fn current(&self) -> SyntaxKind { |
54 | if self.pos == self.tokens.len() { | 54 | if self.pos == self.tokens.len() { |
55 | return true | 55 | return EOF; |
56 | } | 56 | } |
57 | let token = self.tokens[self.pos]; | ||
57 | if let Some(limit) = self.curly_limit { | 58 | if let Some(limit) = self.curly_limit { |
58 | let token = self.tokens[self.pos]; | 59 | if limit == self.curly_level && token.kind == R_CURLY { |
59 | return limit == self.curly_level && token.kind == R_CURLY; | 60 | return EOF |
61 | } | ||
60 | } | 62 | } |
61 | false | 63 | token.kind |
62 | } | 64 | } |
63 | 65 | ||
64 | pub(crate) fn start(&mut self, kind: SyntaxKind) { | 66 | pub(crate) fn start(&mut self, kind: SyntaxKind) { |
@@ -73,24 +75,17 @@ impl<'t> Parser<'t> { | |||
73 | ErrorBuilder::new(self) | 75 | ErrorBuilder::new(self) |
74 | } | 76 | } |
75 | 77 | ||
76 | pub(crate) fn current(&self) -> Option<SyntaxKind> { | 78 | pub(crate) fn bump(&mut self) -> SyntaxKind { |
77 | if self.is_eof() { | 79 | let kind = self.current(); |
78 | return None; | ||
79 | } | ||
80 | let token = self.tokens[self.pos]; | ||
81 | Some(token.kind) | ||
82 | } | ||
83 | |||
84 | pub(crate) fn bump(&mut self) -> Option<SyntaxKind> { | ||
85 | let kind = self.current()?; | ||
86 | match kind { | 80 | match kind { |
87 | L_CURLY => self.curly_level += 1, | 81 | L_CURLY => self.curly_level += 1, |
88 | R_CURLY => self.curly_level -= 1, | 82 | R_CURLY => self.curly_level -= 1, |
83 | EOF => return EOF, | ||
89 | _ => (), | 84 | _ => (), |
90 | } | 85 | } |
91 | self.pos += 1; | 86 | self.pos += 1; |
92 | self.event(Event::Token { kind, n_raw_tokens: 1 }); | 87 | self.event(Event::Token { kind, n_raw_tokens: 1 }); |
93 | Some(kind) | 88 | kind |
94 | } | 89 | } |
95 | 90 | ||
96 | pub(crate) fn lookahead(&self, kinds: &[SyntaxKind]) -> bool { | 91 | pub(crate) fn lookahead(&self, kinds: &[SyntaxKind]) -> bool { |
@@ -114,7 +109,7 @@ impl<'t> Parser<'t> { | |||
114 | if !self.expect(R_CURLY) { | 109 | if !self.expect(R_CURLY) { |
115 | self.start(ERROR); | 110 | self.start(ERROR); |
116 | while self.curly_level > old_level { | 111 | while self.curly_level > old_level { |
117 | if self.bump().is_none() { | 112 | if self.bump() == EOF { |
118 | break; | 113 | break; |
119 | } | 114 | } |
120 | } | 115 | } |