aboutsummaryrefslogtreecommitdiff
path: root/src/parser/event_parser/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/event_parser/parser.rs')
-rw-r--r--src/parser/event_parser/parser.rs35
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};
2use super::{Event}; 2use super::{Event};
3use super::super::is_insignificant; 3use super::super::is_insignificant;
4use syntax_kinds::{L_CURLY, R_CURLY, ERROR}; 4use syntax_kinds::{L_CURLY, R_CURLY, ERROR};
5 5use tree::EOF;
6pub(crate) const EOF: SyntaxKind = SyntaxKind(10000);
7 6
8 7
9pub(crate) struct Parser<'t> { 8pub(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 }