1use core::fmt;
2use core::ops;
3
4use crate::alloc::VecDeque;
5use crate::ast::Spanned;
6use crate::ast::{Kind, OptionSpanned, Span, Token};
7use crate::compile::WithSpan;
8use crate::compile::{self, ErrorKind, Options};
9use crate::macros::{TokenStream, TokenStreamIter};
10use crate::parse::{Advance, Lexer, Parse, Peek};
11use crate::shared::FixedVec;
12use crate::SourceId;
13
14#[derive(Debug)]
28pub struct Parser<'a> {
29 peeker: Peeker<'a>,
30 nesting: usize,
32 max_depth: usize,
34}
35
36impl<'a> Parser<'a> {
37 pub fn new(source: &'a str, source_id: SourceId, shebang: bool) -> Self {
41 Self::with_source(
42 Source {
43 inner: SourceInner::Lexer(Lexer::new(source, source_id, shebang)),
44 },
45 Span::new(0u32, source.len()),
46 )
47 }
48
49 pub fn from_token_stream(token_stream: &'a TokenStream, span: Span) -> Self {
52 Self::with_source(
53 Source {
54 inner: SourceInner::TokenStream(token_stream.iter()),
55 },
56 span,
57 )
58 }
59
60 pub fn parse<T>(&mut self) -> compile::Result<T>
62 where
63 T: Parse,
64 {
65 T::parse(self)
66 }
67
68 pub fn with_max_depth(mut self, max_depth: usize) -> Self {
78 self.max_depth = max_depth;
79 self
80 }
81
82 pub(crate) fn nested<T>(
94 &mut self,
95 parse: impl FnOnce(&mut Self) -> compile::Result<T>,
96 ) -> compile::Result<T> {
97 let nesting = self.nesting;
98 self.deepen()?;
99 let result = parse(self);
100 self.nesting = nesting;
101 result
102 }
103
104 pub(crate) fn link(&mut self) -> compile::Result<()> {
111 self.deepen()
112 }
113
114 fn deepen(&mut self) -> compile::Result<()> {
115 if self.nesting >= self.max_depth {
116 return Err(compile::Error::new(
117 self.span_at(0),
118 ErrorKind::MaxAstDepth {
119 max: self.max_depth,
120 },
121 ));
122 }
123
124 self.nesting += 1;
125 Ok(())
126 }
127
128 pub fn parse_all<T>(&mut self) -> compile::Result<T>
130 where
131 T: Parse,
132 {
133 let item = self.parse::<T>()?;
134 self.eof()?;
135 Ok(item)
136 }
137
138 pub fn peek<T>(&mut self) -> compile::Result<bool>
140 where
141 T: Peek,
142 {
143 if let Some(error) = self.peeker.error.take() {
144 return Err(error);
145 }
146
147 let result = T::peek(&mut self.peeker);
148
149 if let Some(error) = self.peeker.error.take() {
150 return Err(error);
151 }
152
153 Ok(result)
154 }
155
156 pub fn eof(&mut self) -> compile::Result<()> {
158 if let Some(token) = self.peeker.at(0)? {
159 return Err(compile::Error::new(
160 token,
161 ErrorKind::ExpectedEof { actual: token.kind },
162 ));
163 }
164
165 Ok(())
166 }
167
168 pub fn is_eof(&mut self) -> compile::Result<bool> {
171 Ok(self.peeker.at(0)?.is_none())
172 }
173
174 fn with_source(source: Source<'a>, span: Span) -> Self {
176 let default_span = source.span().unwrap_or(span);
177
178 Self {
179 peeker: Peeker {
180 source,
181 buf: VecDeque::new(),
182 error: None,
183 last: None,
184 default_span,
185 },
186 nesting: 0,
187 max_depth: Options::DEFAULT.max_ast_depth,
188 }
189 }
190
191 pub fn try_consume<T>(&mut self) -> compile::Result<bool>
194 where
195 T: Parse + Peek,
196 {
197 Ok(if self.peek::<T>()? {
198 self.parse::<T>()?;
199 true
200 } else {
201 false
202 })
203 }
204
205 pub fn try_consume_all<T>(&mut self) -> compile::Result<bool>
208 where
209 T: Parse + Peek,
210 {
211 let mut consumed = false;
212
213 while self.peek::<T>()? {
214 self.parse::<T>()?;
215 consumed = true;
216 }
217
218 Ok(consumed)
219 }
220
221 pub(crate) fn span(&mut self, range: ops::Range<usize>) -> Span {
223 self.span_at(range.start).join(self.span_at(range.end))
224 }
225
226 pub(crate) fn peeker(&mut self) -> &mut Peeker<'a> {
228 &mut self.peeker
229 }
230
231 pub(crate) fn next(&mut self) -> compile::Result<Token> {
233 if let Some(error) = self.peeker.error.take() {
234 return Err(error);
235 }
236
237 if let Some(t) = self.peeker.buf.pop_front() {
238 return Ok(t);
239 }
240
241 match self.peeker.next()? {
242 Some(t) => Ok(t),
243 None => Err(compile::Error::new(
244 self.last_span().tail(),
245 ErrorKind::UnexpectedEof,
246 )),
247 }
248 }
249
250 pub(crate) fn nth(&mut self, n: usize) -> compile::Result<Kind> {
252 if let Some(t) = self.peeker.at(n)? {
253 Ok(t.kind)
254 } else {
255 Ok(Kind::Eof)
256 }
257 }
258
259 pub(crate) fn span_at(&mut self, n: usize) -> Span {
261 if let Ok(Some(t)) = self.peeker.at(n) {
262 t.span
263 } else {
264 self.last_span().tail()
265 }
266 }
267
268 pub(crate) fn tok_at(&mut self, n: usize) -> compile::Result<Token> {
270 Ok(if let Some(t) = self.peeker.at(n)? {
271 t
272 } else {
273 Token {
274 kind: Kind::Eof,
275 span: self.last_span().tail(),
276 }
277 })
278 }
279
280 pub(crate) fn last_span(&self) -> Span {
282 self.peeker.last_span()
283 }
284}
285
286#[derive(Debug)]
288pub struct Peeker<'a> {
289 source: Source<'a>,
291 buf: VecDeque<Token>,
293 error: Option<compile::Error>,
295 last: Option<Span>,
297 default_span: Span,
299}
300
301impl Peeker<'_> {
302 pub(crate) fn nth(&mut self, n: usize) -> Kind {
304 if self.error.is_some() {
307 return Kind::Error;
308 }
309
310 match self.at(n) {
311 Ok(t) => match t {
312 Some(t) => t.kind,
313 None => Kind::Eof,
314 },
315 Err(error) => {
316 self.error = Some(error);
317 Kind::Error
318 }
319 }
320 }
321
322 pub(crate) fn array<const N: usize>(&mut self) -> FixedVec<Token, N> {
324 let mut vec = FixedVec::new();
325
326 if N == 0 {
327 return vec;
328 }
329
330 if let Err(error) = self.fill(N) {
331 self.error = Some(error);
332 }
333
334 let mut it = 0..N;
335
336 for (&tok, _) in self.buf.iter().zip(it.by_ref()) {
337 _ = vec.try_push(tok);
338 }
339
340 if let Some(error) = &self.error {
341 for _ in it {
342 _ = vec.try_push(Token {
343 kind: Kind::Error,
344 span: error.span(),
345 });
346 }
347 } else {
348 for _ in it {
349 _ = vec.try_push(Token {
350 kind: Kind::Eof,
351 span: self.last_span(),
352 });
353 }
354 }
355
356 vec
357 }
358
359 pub(crate) fn is_eof(&mut self) -> bool {
361 match self.at(0) {
362 Ok(t) => t.is_none(),
363 Err(error) => {
364 self.error = Some(error);
365 false
366 }
367 }
368 }
369
370 fn next(&mut self) -> compile::Result<Option<Token>> {
373 loop {
374 let Some(token) = self.source.next()? else {
375 return Ok(None);
376 };
377
378 match token.kind {
379 Kind::Comment | Kind::Whitespace => {
380 continue;
381 }
382 Kind::MultilineComment(term) => {
383 if !term {
384 return Err(compile::Error::new(
385 token.span,
386 ErrorKind::ExpectedMultilineCommentTerm,
387 ));
388 }
389
390 continue;
391 }
392 _ => (),
393 }
394
395 return Ok(Some(token));
396 }
397 }
398
399 fn at(&mut self, n: usize) -> compile::Result<Option<Token>> {
402 self.fill(n)?;
403 Ok(self.buf.get(n).copied())
404 }
405
406 fn fill(&mut self, n: usize) -> compile::Result<()> {
407 if let Some(error) = self.error.take() {
408 return Err(error);
409 }
410
411 while self.buf.len() <= n {
412 let Some(tok) = self.next()? else {
413 break;
414 };
415
416 self.last = Some(tok.span);
417 self.buf.try_push_back(tok).with_span(tok.span)?;
418 }
419
420 Ok(())
421 }
422
423 fn last_span(&self) -> Span {
425 self.last.unwrap_or(self.default_span)
426 }
427}
428
429pub(crate) struct Source<'a> {
431 inner: SourceInner<'a>,
432}
433
434impl Source<'_> {
435 fn span(&self) -> Option<Span> {
437 match &self.inner {
438 SourceInner::Lexer(lexer) => Some(lexer.span()),
439 SourceInner::TokenStream(token_stream) => token_stream.option_span(),
440 }
441 }
442
443 fn next(&mut self) -> compile::Result<Option<Token>> {
445 match &mut self.inner {
446 SourceInner::Lexer(lexer) => lexer.next(),
447 SourceInner::TokenStream(token_stream) => Ok(token_stream.next()),
448 }
449 }
450}
451
452impl fmt::Debug for Source<'_> {
453 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
454 fmt::Debug::fmt(&self.inner, f)
455 }
456}
457
458#[derive(Debug)]
459enum SourceInner<'a> {
460 Lexer(Lexer<'a>),
461 TokenStream(TokenStreamIter<'a>),
462}
463
464impl Advance for Parser<'_> {
465 type Error = compile::Error;
466
467 #[inline]
468 fn advance(&mut self, n: usize) -> Result<(), Self::Error> {
469 for _ in 0..n {
470 self.next()?;
471 }
472
473 Ok(())
474 }
475}