diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2018-01-28 11:34:32 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2018-01-28 11:34:32 +0000 |
commit | 4212d28727fca0de8c3f5d4504025c3028425386 (patch) | |
tree | 044832f0c569f54ca92bdf618c6cc4b3b68940e9 /src/parser/event_parser/parser.rs | |
parent | 7a6fa6504c5458dcc32e24327ba0ec597222fc63 (diff) | |
parent | 2141888782a74de4a655fee585c99163a3e75e5c (diff) |
Merge #25
25: Drop curly_block r=matklad a=matklad
closes #13
Diffstat (limited to 'src/parser/event_parser/parser.rs')
-rw-r--r-- | src/parser/event_parser/parser.rs | 52 |
1 files changed, 6 insertions, 46 deletions
diff --git a/src/parser/event_parser/parser.rs b/src/parser/event_parser/parser.rs index 573e3d73a..a15d0b633 100644 --- a/src/parser/event_parser/parser.rs +++ b/src/parser/event_parser/parser.rs | |||
@@ -1,7 +1,7 @@ | |||
1 | use {SyntaxKind, TextUnit, Token}; | 1 | use {SyntaxKind, TextUnit, Token}; |
2 | use super::Event; | 2 | use super::Event; |
3 | use super::super::is_insignificant; | 3 | use super::super::is_insignificant; |
4 | use SyntaxKind::{EOF, ERROR, L_CURLY, R_CURLY, TOMBSTONE}; | 4 | use SyntaxKind::{EOF, TOMBSTONE}; |
5 | 5 | ||
6 | pub(crate) struct Marker { | 6 | pub(crate) struct Marker { |
7 | pos: u32, | 7 | pos: u32, |
@@ -106,9 +106,6 @@ pub(crate) struct Parser<'t> { | |||
106 | 106 | ||
107 | pos: usize, | 107 | pos: usize, |
108 | events: Vec<Event>, | 108 | events: Vec<Event>, |
109 | |||
110 | curly_level: i32, | ||
111 | curly_limit: Option<i32>, | ||
112 | } | 109 | } |
113 | 110 | ||
114 | impl<'t> Parser<'t> { | 111 | impl<'t> Parser<'t> { |
@@ -131,30 +128,14 @@ impl<'t> Parser<'t> { | |||
131 | 128 | ||
132 | pos: 0, | 129 | pos: 0, |
133 | events: Vec::new(), | 130 | events: Vec::new(), |
134 | curly_level: 0, | ||
135 | curly_limit: None, | ||
136 | } | 131 | } |
137 | } | 132 | } |
138 | 133 | ||
139 | pub(crate) fn into_events(self) -> Vec<Event> { | 134 | pub(crate) fn into_events(self) -> Vec<Event> { |
140 | assert!(self.curly_limit.is_none()); | ||
141 | assert_eq!(self.current(), EOF); | 135 | assert_eq!(self.current(), EOF); |
142 | self.events | 136 | self.events |
143 | } | 137 | } |
144 | 138 | ||
145 | pub(crate) fn current(&self) -> SyntaxKind { | ||
146 | if self.pos == self.tokens.len() { | ||
147 | return EOF; | ||
148 | } | ||
149 | let token = self.tokens[self.pos]; | ||
150 | if let Some(limit) = self.curly_limit { | ||
151 | if limit == self.curly_level && token.kind == R_CURLY { | ||
152 | return EOF; | ||
153 | } | ||
154 | } | ||
155 | token.kind | ||
156 | } | ||
157 | |||
158 | pub(crate) fn start(&mut self) -> Marker { | 139 | pub(crate) fn start(&mut self) -> Marker { |
159 | let m = Marker { | 140 | let m = Marker { |
160 | pos: self.events.len() as u32, | 141 | pos: self.events.len() as u32, |
@@ -172,11 +153,8 @@ impl<'t> Parser<'t> { | |||
172 | 153 | ||
173 | pub(crate) fn bump(&mut self) -> SyntaxKind { | 154 | pub(crate) fn bump(&mut self) -> SyntaxKind { |
174 | let kind = self.current(); | 155 | let kind = self.current(); |
175 | match kind { | 156 | if kind == EOF { |
176 | L_CURLY => self.curly_level += 1, | 157 | return EOF; |
177 | R_CURLY => self.curly_level -= 1, | ||
178 | EOF => return EOF, | ||
179 | _ => (), | ||
180 | } | 158 | } |
181 | self.pos += 1; | 159 | self.pos += 1; |
182 | self.event(Event::Token { | 160 | self.event(Event::Token { |
@@ -186,30 +164,12 @@ impl<'t> Parser<'t> { | |||
186 | kind | 164 | kind |
187 | } | 165 | } |
188 | 166 | ||
189 | pub(crate) fn raw_lookahead(&self, n: usize) -> SyntaxKind { | 167 | pub(crate) fn nth(&self, n: usize) -> SyntaxKind { |
190 | self.tokens.get(self.pos + n).map(|t| t.kind).unwrap_or(EOF) | 168 | self.tokens.get(self.pos + n).map(|t| t.kind).unwrap_or(EOF) |
191 | } | 169 | } |
192 | 170 | ||
193 | pub(crate) fn curly_block<F: FnOnce(&mut Parser)>(&mut self, f: F) -> bool { | 171 | pub(crate) fn current(&self) -> SyntaxKind { |
194 | let old_level = self.curly_level; | 172 | self.nth(0) |
195 | let old_limit = self.curly_limit; | ||
196 | if !self.expect(L_CURLY) { | ||
197 | return false; | ||
198 | } | ||
199 | self.curly_limit = Some(self.curly_level); | ||
200 | f(self); | ||
201 | assert!(self.curly_level > old_level); | ||
202 | self.curly_limit = old_limit; | ||
203 | if !self.expect(R_CURLY) { | ||
204 | let err = self.start(); | ||
205 | while self.curly_level > old_level { | ||
206 | if self.bump() == EOF { | ||
207 | break; | ||
208 | } | ||
209 | } | ||
210 | err.complete(self, ERROR); | ||
211 | } | ||
212 | true | ||
213 | } | 173 | } |
214 | 174 | ||
215 | fn event(&mut self, event: Event) { | 175 | fn event(&mut self, event: Event) { |