1use crate::ast::*;
2use crate::token::{Span, Token, TokenKind};
3
4#[derive(Debug, Clone)]
5pub struct ParseError {
6 pub message: String,
7 pub span: Span,
8}
9
10impl ParseError {
11 pub fn new(message: impl Into<String>, span: Span) -> Self {
12 ParseError { message: message.into(), span }
13 }
14}
15
16impl std::fmt::Display for ParseError {
17 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18 write!(f, "parse error at {}: {}", self.span, self.message)
19 }
20}
21
22impl std::error::Error for ParseError {}
23
24pub struct Parser {
25 tokens: Vec<Token>,
26 pos: usize,
27}
28
29impl Parser {
30 pub fn new(tokens: Vec<Token>) -> Self {
31 Parser { tokens, pos: 0 }
32 }
33
34 pub fn parse(tokens: Vec<Token>) -> Result<Vec<Stmt>, ParseError> {
35 let mut parser = Parser::new(tokens);
36 let mut stmts = Vec::new();
37 while !parser.is_at_end() {
38 if parser.peek_kind() == Some(&TokenKind::Semicolon) {
39 parser.advance();
40 continue;
41 }
42 if let Some(stmt) = parser.parse_top_level_stmt()? {
43 stmts.push(stmt);
44 }
45 }
46 Ok(stmts)
47 }
48
49 pub fn parse_expr(tokens: Vec<Token>) -> Result<Expr, ParseError> {
50 let mut parser = Parser::new(tokens);
51 let expr = parser.parse_expression()?;
52 Ok(expr)
53 }
54
55 fn is_at_end(&self) -> bool {
56 self.pos >= self.tokens.len() || self.peek_kind() == Some(&TokenKind::Eof)
57 }
58
59 fn peek(&self) -> &Token {
60 self.tokens.get(self.pos).unwrap_or_else(|| self.tokens.last().unwrap())
61 }
62
63 fn peek_kind(&self) -> Option<&TokenKind> {
64 if self.pos < self.tokens.len() {
65 Some(&self.tokens[self.pos].kind)
66 } else {
67 None
68 }
69 }
70
71 fn peek_at(&self, offset: usize) -> &Token {
72 let idx = self.pos + offset;
73 self.tokens.get(idx).unwrap_or_else(|| self.tokens.last().unwrap())
74 }
75
76 fn advance(&mut self) -> Token {
77 let tok = self.tokens.get(self.pos).cloned().unwrap_or_else(|| self.tokens.last().cloned().unwrap());
78 if self.pos < self.tokens.len() {
79 self.pos += 1;
80 }
81 tok
82 }
83
84 fn expect(&mut self, kind: &TokenKind) -> Result<Token, ParseError> {
85 let tok = self.peek().clone();
86 if &tok.kind == kind {
87 self.advance();
88 Ok(tok)
89 } else {
90 Err(ParseError::new(
91 format!("expected {}, got {}", kind, tok.kind),
92 tok.span,
93 ))
94 }
95 }
96
97 fn expect_identifier(&mut self) -> Result<(String, Span), ParseError> {
98 let tok = self.peek().clone();
99 match &tok.kind {
100 TokenKind::Identifier(name) => {
101 let name = name.clone();
102 self.advance();
103 Ok((name, tok.span))
104 }
105 _ => Err(ParseError::new(format!("expected identifier, got {}", tok.kind), tok.span)),
106 }
107 }
108
109 fn skip_semicolons(&mut self) {
110 while self.peek_kind() == Some(&TokenKind::Semicolon) {
111 self.advance();
112 }
113 }
114
115 fn current_span(&self) -> Span {
116 self.peek().span.clone()
117 }
118
119 fn lookahead_typed_params(&self) -> bool {
120 let offset = 0usize;
121 loop {
122 let tok = self.peek_at(offset);
123 match &tok.kind {
124 TokenKind::Identifier(_name) => {
125 let next = self.peek_at(offset + 1);
126 if next.kind == TokenKind::Colon {
127 let after_colon = self.peek_at(offset + 2);
128 match &after_colon.kind {
129 TokenKind::Identifier(_) | TokenKind::LeftBracket => {
130 return true;
131 }
132 _ => return false,
133 }
134 } else {
135 return false;
136 }
137 }
138 _ => return false,
139 }
140 }
141 }
142
143 fn parse_typed_params_list(&mut self) -> Result<Vec<Param>, ParseError> {
144 let mut params = Vec::new();
145 loop {
146 let (name, _) = self.expect_identifier()?;
147 let type_ann = if self.peek_kind() == Some(&TokenKind::Colon) {
148 self.advance();
149 Some(self.parse_type()?)
150 } else {
151 None
152 };
153 params.push(Param { name, type_ann, default: None });
154 if self.peek_kind() == Some(&TokenKind::Comma) {
155 self.advance();
156 } else {
157 break;
158 }
159 }
160 Ok(params)
161 }
162
163 fn parse_top_level_stmt(&mut self) -> Result<Option<Stmt>, ParseError> {
164 match self.peek_kind() {
165 Some(TokenKind::Package) => {
166 self.advance();
167 let mut path = vec![self.expect_identifier()?.0];
168 while self.peek_kind() == Some(&TokenKind::Dot) {
169 self.advance();
170 path.push(self.expect_identifier()?.0);
171 }
172 self.skip_semicolons();
173 Ok(None)
174 }
175 Some(TokenKind::Import) => {
176 let import = self.parse_import()?;
177 Ok(Some(import))
178 }
179 Some(TokenKind::Val) => {
180 let d = self.parse_val_decl()?;
181 self.skip_semicolons();
182 Ok(Some(d))
183 }
184 Some(TokenKind::Var) => {
185 let d = self.parse_var_decl()?;
186 self.skip_semicolons();
187 Ok(Some(d))
188 }
189 Some(TokenKind::Def) => {
190 let d = self.parse_def_decl()?;
191 self.skip_semicolons();
192 Ok(Some(Stmt::DefDecl(d)))
193 }
194 Some(TokenKind::Class) | Some(TokenKind::Case) => {
195 let d = self.parse_class_decl()?;
196 self.skip_semicolons();
197 Ok(Some(Stmt::ClassDecl(d)))
198 }
199 Some(TokenKind::Trait) => {
200 let d = self.parse_trait_decl()?;
201 self.skip_semicolons();
202 Ok(Some(Stmt::TraitDecl(d)))
203 }
204 Some(TokenKind::Object) => {
205 let d = self.parse_object_decl()?;
206 self.skip_semicolons();
207 Ok(Some(Stmt::ObjectDecl(d)))
208 }
209 Some(TokenKind::Type) => {
210 let d = self.parse_type_decl()?;
211 self.skip_semicolons();
212 Ok(Some(d))
213 }
214 Some(TokenKind::Abstract) => {
215 self.advance();
216 if self.peek_kind() == Some(&TokenKind::Class) {
217 let mut d = self.parse_class_decl()?;
218 d.is_abstract = true;
219 self.skip_semicolons();
220 Ok(Some(Stmt::ClassDecl(d)))
221 } else {
222 Err(ParseError::new("expected 'class' after 'abstract'", self.current_span()))
223 }
224 }
225 Some(TokenKind::Sealed) => {
226 self.advance();
227 if self.peek_kind() == Some(&TokenKind::Trait) {
228 self.parse_trait_decl().map(|d| {
229 self.skip_semicolons();
230 Some(Stmt::TraitDecl(d))
231 })
232 } else if self.peek_kind() == Some(&TokenKind::Abstract) {
233 self.advance();
234 if self.peek_kind() == Some(&TokenKind::Class) {
235 let mut d = self.parse_class_decl()?;
236 d.is_abstract = true;
237 self.skip_semicolons();
238 Ok(Some(Stmt::ClassDecl(d)))
239 } else {
240 Err(ParseError::new("expected 'class'", self.current_span()))
241 }
242 } else {
243 Err(ParseError::new("expected 'trait' or 'abstract class' after 'sealed'", self.current_span()))
244 }
245 }
246 _ => {
247 let expr = self.parse_expression()?;
248 self.skip_semicolons();
249 Ok(Some(Stmt::Expr(expr)))
250 }
251 }
252 }
253
254 fn parse_import(&mut self) -> Result<Stmt, ParseError> {
255 let span = self.current_span();
256 self.advance(); let mut path = vec![self.expect_identifier()?.0];
258 while self.peek_kind() == Some(&TokenKind::Dot) {
259 self.advance();
260 if self.peek_kind() == Some(&TokenKind::Underscore) {
261 self.advance();
262 path.push("_".into());
263 return Ok(Stmt::ImportDecl {
264 path,
265 selectors: ImportSelectors::All,
266 span,
267 });
268 }
269 path.push(self.expect_identifier()?.0);
270 }
271 let selectors = if self.peek_kind() == Some(&TokenKind::LeftBrace) {
272 self.advance();
273 let mut names = Vec::new();
274 loop {
275 names.push(self.expect_identifier()?.0);
276 if self.peek_kind() == Some(&TokenKind::Comma) {
277 self.advance();
278 } else {
279 break;
280 }
281 }
282 self.expect(&TokenKind::RightBrace)?;
283 ImportSelectors::Names(names)
284 } else {
285 ImportSelectors::All
286 };
287 Ok(Stmt::ImportDecl { path, selectors, span })
288 }
289
290 fn parse_val_decl(&mut self) -> Result<Stmt, ParseError> {
291 let span = self.current_span();
292 self.advance(); let pattern = self.parse_pattern()?;
294 let type_ann = if self.peek_kind() == Some(&TokenKind::Colon) {
295 self.advance();
296 Some(self.parse_type()?)
297 } else {
298 None
299 };
300 self.expect(&TokenKind::Equals)?;
301 let value = self.parse_expression()?;
302 Ok(Stmt::ValDecl { pattern, type_ann, value, span })
303 }
304
305 fn parse_var_decl(&mut self) -> Result<Stmt, ParseError> {
306 let span = self.current_span();
307 self.advance(); let pattern = self.parse_pattern()?;
309 let type_ann = if self.peek_kind() == Some(&TokenKind::Colon) {
310 self.advance();
311 Some(self.parse_type()?)
312 } else {
313 None
314 };
315 self.expect(&TokenKind::Equals)?;
316 let value = self.parse_expression()?;
317 Ok(Stmt::VarDecl { pattern, type_ann, value, span })
318 }
319
320 fn parse_def_decl(&mut self) -> Result<DefDecl, ParseError> {
321 let span = self.current_span();
322 self.advance(); let (name, _) = self.expect_identifier()?;
324 let type_params = self.parse_type_params_opt()?;
325 let mut params = if self.peek_kind() == Some(&TokenKind::LeftParen) {
326 self.parse_params()?
327 } else {
328 Vec::new()
329 };
330
331 while self.peek_kind() == Some(&TokenKind::LeftParen) {
332 let extra_params = self.parse_params()?;
333 let outer_body_span = self.current_span();
334 let ret_type = if self.peek_kind() == Some(&TokenKind::Colon) {
335 self.advance();
336 let t = self.parse_type()?;
337 Some(t)
338 } else {
339 None
340 };
341 let inner_body = if self.peek_kind() == Some(&TokenKind::Equals) {
342 self.advance();
343 self.parse_expression()?
344 } else if self.peek_kind() == Some(&TokenKind::LeftBrace) {
345 self.parse_block()?
346 } else {
347 break;
348 };
349 let _param_names: Vec<String> = extra_params.iter().map(|p| p.name.clone()).collect();
350 params.push(Param {
351 name: format!("__curried__{}", extra_params.len()),
352 type_ann: None,
353 default: None,
354 });
355 let fn_val = Expr::Lambda {
356 params: extra_params,
357 body: Box::new(inner_body),
358 span: outer_body_span,
359 };
360 return Ok(DefDecl {
361 name,
362 type_params,
363 params,
364 return_type: ret_type,
365 body: fn_val,
366 span,
367 });
368 }
369
370 let return_type = if self.peek_kind() == Some(&TokenKind::Colon) {
371 self.advance();
372 Some(self.parse_type()?)
373 } else {
374 None
375 };
376 let body = if self.peek_kind() == Some(&TokenKind::Equals) {
377 self.advance();
378 self.parse_expression()?
379 } else if self.peek_kind() == Some(&TokenKind::LeftBrace) {
380 self.parse_block()?
381 } else {
382 Expr::Literal { value: Literal::Unit, span: self.current_span() }
383 };
384 Ok(DefDecl { name, type_params, params, return_type, body, span })
385 }
386
387 fn parse_class_decl(&mut self) -> Result<ClassDecl, ParseError> {
388 let span = self.current_span();
389 let is_case = if self.peek_kind() == Some(&TokenKind::Case) {
390 self.advance();
391 true
392 } else {
393 false
394 };
395 self.advance(); let (name, _) = self.expect_identifier()?;
397 let type_params = self.parse_type_params_opt()?;
398 let ctor_params = if self.peek_kind() == Some(&TokenKind::LeftParen) {
399 self.parse_params()?
400 } else {
401 Vec::new()
402 };
403 let mut parents = Vec::new();
404 if self.peek_kind() == Some(&TokenKind::Extends) {
405 self.advance();
406 let (parent_name, _) = self.expect_identifier()?;
407 let parent_args = if self.peek_kind() == Some(&TokenKind::LeftParen) {
408 self.parse_arguments()?
409 } else {
410 Vec::new()
411 };
412 parents.push((parent_name, parent_args));
413 while self.peek_kind() == Some(&TokenKind::With) {
414 self.advance();
415 let (parent_name, _) = self.expect_identifier()?;
416 let parent_args = if self.peek_kind() == Some(&TokenKind::LeftParen) {
417 self.parse_arguments()?
418 } else {
419 Vec::new()
420 };
421 parents.push((parent_name, parent_args));
422 }
423 }
424 let body = if self.peek_kind() == Some(&TokenKind::LeftBrace) {
425 self.parse_class_body()?
426 } else {
427 Vec::new()
428 };
429 Ok(ClassDecl {
430 name, type_params, ctor_params, parents, body, is_case, is_abstract: false, span,
431 })
432 }
433
434 fn parse_trait_decl(&mut self) -> Result<TraitDecl, ParseError> {
435 let span = self.current_span();
436 self.advance(); let (name, _) = self.expect_identifier()?;
438 let type_params = self.parse_type_params_opt()?;
439 let mut parents = Vec::new();
440 if self.peek_kind() == Some(&TokenKind::Extends) {
441 self.advance();
442 let (parent_name, _) = self.expect_identifier()?;
443 parents.push(parent_name);
444 while self.peek_kind() == Some(&TokenKind::With) {
445 self.advance();
446 let (parent_name, _) = self.expect_identifier()?;
447 parents.push(parent_name);
448 }
449 }
450 let body = if self.peek_kind() == Some(&TokenKind::LeftBrace) {
451 self.parse_class_body()?
452 } else {
453 Vec::new()
454 };
455 Ok(TraitDecl { name, type_params, parents, body, span })
456 }
457
458 fn parse_object_decl(&mut self) -> Result<ObjectDecl, ParseError> {
459 let span = self.current_span();
460 self.advance(); let (name, _) = self.expect_identifier()?;
462 let mut parents = Vec::new();
463 if self.peek_kind() == Some(&TokenKind::Extends) {
464 self.advance();
465 let (parent_name, _) = self.expect_identifier()?;
466 let parent_args = if self.peek_kind() == Some(&TokenKind::LeftParen) {
467 self.parse_arguments()?
468 } else {
469 Vec::new()
470 };
471 parents.push((parent_name, parent_args));
472 while self.peek_kind() == Some(&TokenKind::With) {
473 self.advance();
474 let (parent_name, _) = self.expect_identifier()?;
475 let parent_args = if self.peek_kind() == Some(&TokenKind::LeftParen) {
476 self.parse_arguments()?
477 } else {
478 Vec::new()
479 };
480 parents.push((parent_name, parent_args));
481 }
482 }
483 let body = if self.peek_kind() == Some(&TokenKind::LeftBrace) {
484 self.parse_class_body()?
485 } else {
486 Vec::new()
487 };
488 Ok(ObjectDecl { name, parents, body, span })
489 }
490
491 fn parse_type_decl(&mut self) -> Result<Stmt, ParseError> {
492 let span = self.current_span();
493 self.advance(); let (name, _) = self.expect_identifier()?;
495 let type_params = self.parse_type_params_opt()?;
496 self.expect(&TokenKind::Equals)?;
497 let rhs = self.parse_type()?;
498 Ok(Stmt::TypeDecl { name, type_params, rhs, span })
499 }
500
501 fn parse_class_body(&mut self) -> Result<Vec<Stmt>, ParseError> {
502 self.expect(&TokenKind::LeftBrace)?;
503 let mut stmts = Vec::new();
504 while self.peek_kind() != Some(&TokenKind::RightBrace) && !self.is_at_end() {
505 if self.peek_kind() == Some(&TokenKind::Semicolon) {
506 self.advance();
507 continue;
508 }
509 match self.peek_kind() {
510 Some(TokenKind::Val) => {
511 stmts.push(self.parse_val_decl()?);
512 }
513 Some(TokenKind::Var) => {
514 stmts.push(self.parse_var_decl()?);
515 }
516 Some(TokenKind::Def) => {
517 stmts.push(Stmt::DefDecl(self.parse_def_decl()?));
518 }
519 Some(TokenKind::This) if self.peek_at(1).kind == TokenKind::LeftParen => {
520 self.advance(); let _params = self.parse_params()?;
522 let _body = if self.peek_kind() == Some(&TokenKind::Equals) {
523 self.advance();
524 Some(self.parse_expression()?)
525 } else {
526 None
527 };
528 }
529 Some(TokenKind::Type) => {
530 stmts.push(self.parse_type_decl()?);
531 }
532 Some(TokenKind::Override) => {
533 self.advance();
534 if self.peek_kind() == Some(&TokenKind::Def) {
535 stmts.push(Stmt::DefDecl(self.parse_def_decl()?));
536 }
537 }
538 Some(TokenKind::Private) | Some(TokenKind::Protected) => {
539 self.advance();
540 if self.peek_kind() == Some(&TokenKind::Def) {
541 stmts.push(Stmt::DefDecl(self.parse_def_decl()?));
542 } else if self.peek_kind() == Some(&TokenKind::Val) {
543 stmts.push(self.parse_val_decl()?);
544 } else if self.peek_kind() == Some(&TokenKind::Var) {
545 stmts.push(self.parse_var_decl()?);
546 }
547 }
548 _ => {
549 let expr = self.parse_expression()?;
550 stmts.push(Stmt::Expr(expr));
551 }
552 }
553 self.skip_semicolons();
554 }
555 self.expect(&TokenKind::RightBrace)?;
556 Ok(stmts)
557 }
558
559 fn parse_params(&mut self) -> Result<Vec<Param>, ParseError> {
560 self.expect(&TokenKind::LeftParen)?;
561 let mut params = Vec::new();
562 while self.peek_kind() != Some(&TokenKind::RightParen) {
563 if self.peek_kind() == Some(&TokenKind::Val) || self.peek_kind() == Some(&TokenKind::Var) {
564 self.advance();
565 }
566 let (name, _) = self.expect_identifier()?;
567 let type_ann = if self.peek_kind() == Some(&TokenKind::Colon) {
568 self.advance();
569 if self.peek_kind() == Some(&TokenKind::Star) {
570 self.advance();
571 Some(TypeExpr::Parameterized {
572 base: Box::new(TypeExpr::simple("Seq")),
573 args: vec![self.parse_type()?],
574 span: Span::zero(),
575 })
576 } else {
577 Some(self.parse_type()?)
578 }
579 } else {
580 None
581 };
582 let default = if self.peek_kind() == Some(&TokenKind::Equals) {
583 self.advance();
584 Some(self.parse_expression()?)
585 } else {
586 None
587 };
588 params.push(Param { name, type_ann, default });
589 if self.peek_kind() == Some(&TokenKind::Comma) {
590 self.advance();
591 } else {
592 break;
593 }
594 }
595 self.expect(&TokenKind::RightParen)?;
596 Ok(params)
597 }
598
599 fn parse_type_params_opt(&mut self) -> Result<Vec<TypeParam>, ParseError> {
600 if self.peek_kind() != Some(&TokenKind::LeftBracket) {
601 return Ok(Vec::new());
602 }
603 self.advance();
604 let mut params = Vec::new();
605 while self.peek_kind() != Some(&TokenKind::RightBracket) {
606 let variance = if self.peek_kind() == Some(&TokenKind::Plus) {
607 self.advance();
608 Variance::Covariant
609 } else if self.peek_kind() == Some(&TokenKind::Minus) {
610 self.advance();
611 Variance::Contravariant
612 } else {
613 Variance::Invariant
614 };
615 let (name, _) = self.expect_identifier()?;
616 let upper_bound = if self.peek_kind() == Some(&TokenKind::LessThan) {
617 self.advance();
618 Some(self.parse_type()?)
619 } else {
620 None
621 };
622 let lower_bound = if self.peek_kind() == Some(&TokenKind::GreaterThan) {
623 self.advance();
624 Some(self.parse_type()?)
625 } else {
626 None
627 };
628 params.push(TypeParam { name, variance, upper_bound, lower_bound });
629 if self.peek_kind() == Some(&TokenKind::Comma) {
630 self.advance();
631 } else {
632 break;
633 }
634 }
635 self.expect(&TokenKind::RightBracket)?;
636 Ok(params)
637 }
638
639 fn parse_type(&mut self) -> Result<TypeExpr, ParseError> {
640 let span = self.current_span();
641 let mut ty = self.parse_simple_type()?;
642 if self.peek_kind() == Some(&TokenKind::Arrow) {
643 self.advance();
644 let result = self.parse_type()?;
645 let params = match ty {
646 TypeExpr::Tuple { elements, .. } if elements.len() > 1 => elements,
647 other => vec![other],
648 };
649 ty = TypeExpr::Function {
650 params,
651 result: Box::new(result),
652 span,
653 };
654 }
655 Ok(ty)
656 }
657
658 fn parse_simple_type(&mut self) -> Result<TypeExpr, ParseError> {
659 let span = self.current_span();
660 if self.peek_kind() == Some(&TokenKind::LeftParen) {
661 self.advance();
662 if self.peek_kind() == Some(&TokenKind::RightParen) {
663 self.advance();
664 return Ok(TypeExpr::Tuple { elements: vec![], span });
665 }
666 let first = self.parse_type()?;
667 if self.peek_kind() == Some(&TokenKind::Comma) {
668 let mut elements = vec![first];
669 while self.peek_kind() == Some(&TokenKind::Comma) {
670 self.advance();
671 elements.push(self.parse_type()?);
672 }
673 self.expect(&TokenKind::RightParen)?;
674 return Ok(TypeExpr::Tuple { elements, span });
675 }
676 self.expect(&TokenKind::RightParen)?;
677 return Ok(first);
678 }
679
680 if self.peek_kind() == Some(&TokenKind::Underscore) {
681 self.advance();
682 return Ok(TypeExpr::Wildcard {
683 upper: None,
684 lower: None,
685 span,
686 });
687 }
688
689 let (name, _) = self.expect_identifier()?;
690 let mut ty = TypeExpr::Simple { name, span: span.clone() };
691
692 if self.peek_kind() == Some(&TokenKind::LeftBracket) {
693 self.advance();
694 let mut args = Vec::new();
695 while self.peek_kind() != Some(&TokenKind::RightBracket) {
696 args.push(self.parse_type()?);
697 if self.peek_kind() == Some(&TokenKind::Comma) {
698 self.advance();
699 } else {
700 break;
701 }
702 }
703 self.expect(&TokenKind::RightBracket)?;
704 ty = TypeExpr::Parameterized { base: Box::new(ty), args, span };
705 }
706
707 Ok(ty)
708 }
709
710 fn parse_arguments(&mut self) -> Result<Vec<Expr>, ParseError> {
711 self.expect(&TokenKind::LeftParen)?;
712 let mut args = Vec::new();
713 while self.peek_kind() != Some(&TokenKind::RightParen) {
714 args.push(self.parse_expression()?);
715 if self.peek_kind() == Some(&TokenKind::Comma) {
716 self.advance();
717 } else {
718 break;
719 }
720 }
721 self.expect(&TokenKind::RightParen)?;
722 Ok(args)
723 }
724
725 fn parse_expression(&mut self) -> Result<Expr, ParseError> {
726 let _span = self.current_span();
727 let expr = self.parse_assignment()?;
728 Ok(expr)
729 }
730
731 fn parse_assignment(&mut self) -> Result<Expr, ParseError> {
732 let span = self.current_span();
733 let expr = self.parse_or()?;
734 if self.peek_kind() == Some(&TokenKind::Equals) {
735 self.advance();
736 let value = self.parse_assignment()?;
737 Ok(Expr::Assign {
738 target: Box::new(expr),
739 value: Box::new(value),
740 span,
741 })
742 } else {
743 Ok(expr)
744 }
745 }
746
747 fn parse_or(&mut self) -> Result<Expr, ParseError> {
748 let span = self.current_span();
749 let mut left = self.parse_and()?;
750 while self.peek_kind() == Some(&TokenKind::PipePipe) {
751 self.advance();
752 let right = self.parse_and()?;
753 left = Expr::Binary {
754 left: Box::new(left),
755 op: BinOp::Or,
756 right: Box::new(right),
757 span,
758 };
759 }
760 Ok(left)
761 }
762
763 fn parse_and(&mut self) -> Result<Expr, ParseError> {
764 let span = self.current_span();
765 let mut left = self.parse_equality()?;
766 while self.peek_kind() == Some(&TokenKind::AmpersandAmpersand) {
767 self.advance();
768 let right = self.parse_equality()?;
769 left = Expr::Binary {
770 left: Box::new(left),
771 op: BinOp::And,
772 right: Box::new(right),
773 span,
774 };
775 }
776 Ok(left)
777 }
778
779 fn parse_equality(&mut self) -> Result<Expr, ParseError> {
780 let span = self.current_span();
781 let mut left = self.parse_comparison()?;
782 loop {
783 let op = match self.peek_kind() {
784 Some(TokenKind::EqualsEquals) => BinOp::Eq,
785 Some(TokenKind::BangEquals) => BinOp::Neq,
786 _ => break,
787 };
788 self.advance();
789 let right = self.parse_comparison()?;
790 left = Expr::Binary {
791 left: Box::new(left),
792 op,
793 right: Box::new(right),
794 span,
795 };
796 }
797 Ok(left)
798 }
799
800 fn parse_comparison(&mut self) -> Result<Expr, ParseError> {
801 let span = self.current_span();
802 let mut left = self.parse_additive()?;
803 loop {
804 let op = match self.peek_kind() {
805 Some(TokenKind::LessThan) => BinOp::Lt,
806 Some(TokenKind::GreaterThan) => BinOp::Gt,
807 Some(TokenKind::LessEquals) => BinOp::Leq,
808 Some(TokenKind::GreaterEquals) => BinOp::Geq,
809 _ => break,
810 };
811 self.advance();
812 let right = self.parse_additive()?;
813 left = Expr::Binary {
814 left: Box::new(left),
815 op,
816 right: Box::new(right),
817 span,
818 };
819 }
820 Ok(left)
821 }
822
823 fn parse_additive(&mut self) -> Result<Expr, ParseError> {
824 let span = self.current_span();
825 let mut left = self.parse_multiplicative()?;
826 loop {
827 let op = match self.peek_kind() {
828 Some(TokenKind::Plus) => BinOp::Add,
829 Some(TokenKind::Minus) => BinOp::Sub,
830 Some(TokenKind::Pipe) => BinOp::BitOr,
831 Some(TokenKind::Caret) => BinOp::BitXor,
832 _ => break,
833 };
834 self.advance();
835 let right = self.parse_multiplicative()?;
836 left = Expr::Binary {
837 left: Box::new(left),
838 op,
839 right: Box::new(right),
840 span,
841 };
842 }
843 Ok(left)
844 }
845
846 fn parse_multiplicative(&mut self) -> Result<Expr, ParseError> {
847 let span = self.current_span();
848 let mut left = self.parse_shift()?;
849 loop {
850 let op = match self.peek_kind() {
851 Some(TokenKind::Star) => BinOp::Mul,
852 Some(TokenKind::Slash) => BinOp::Div,
853 Some(TokenKind::Percent) => BinOp::Mod,
854 Some(TokenKind::Ampersand) => BinOp::BitAnd,
855 _ => break,
856 };
857 self.advance();
858 let right = self.parse_shift()?;
859 left = Expr::Binary {
860 left: Box::new(left),
861 op,
862 right: Box::new(right),
863 span,
864 };
865 }
866 Ok(left)
867 }
868
869 fn parse_shift(&mut self) -> Result<Expr, ParseError> {
870 let span = self.current_span();
871 let mut left = self.parse_unary()?;
872 loop {
873 let op = match self.peek_kind() {
874 Some(TokenKind::LeftShift) => BinOp::LeftShift,
875 Some(TokenKind::RightShift) => BinOp::RightShift,
876 Some(TokenKind::UnsignedRightShift) => BinOp::UnsignedRightShift,
877 _ => break,
878 };
879 self.advance();
880 let right = self.parse_unary()?;
881 left = Expr::Binary {
882 left: Box::new(left),
883 op,
884 right: Box::new(right),
885 span,
886 };
887 }
888 Ok(left)
889 }
890
891 fn parse_unary(&mut self) -> Result<Expr, ParseError> {
892 let span = self.current_span();
893 match self.peek_kind() {
894 Some(TokenKind::Minus) => {
895 self.advance();
896 let operand = self.parse_unary()?;
897 Ok(Expr::Unary {
898 op: UnaryOp::Negate,
899 operand: Box::new(operand),
900 span,
901 })
902 }
903 Some(TokenKind::Plus) => {
904 self.advance();
905 let operand = self.parse_unary()?;
906 Ok(Expr::Unary {
907 op: UnaryOp::Positive,
908 operand: Box::new(operand),
909 span,
910 })
911 }
912 Some(TokenKind::Exclaim) => {
913 self.advance();
914 let operand = self.parse_unary()?;
915 Ok(Expr::Unary {
916 op: UnaryOp::Not,
917 operand: Box::new(operand),
918 span,
919 })
920 }
921 Some(TokenKind::Tilde) => {
922 self.advance();
923 let operand = self.parse_unary()?;
924 Ok(Expr::Unary {
925 op: UnaryOp::BitNot,
926 operand: Box::new(operand),
927 span,
928 })
929 }
930 _ => self.parse_postfix(),
931 }
932 }
933
934 fn parse_postfix(&mut self) -> Result<Expr, ParseError> {
935 let mut expr = self.parse_primary()?;
936 loop {
937 let span = self.current_span();
938 match self.peek_kind() {
939 Some(TokenKind::Dot) => {
940 self.advance();
941 let (name, _) = self.expect_identifier()?;
942 if self.peek_kind() == Some(&TokenKind::LeftParen) {
943 let args = self.parse_arguments()?;
944 expr = Expr::MethodCall {
945 receiver: Box::new(expr),
946 method: name,
947 args,
948 span,
949 };
950 } else if self.peek_kind() == Some(&TokenKind::Underscore) {
951 self.advance();
952 } else {
953 expr = Expr::FieldAccess {
954 receiver: Box::new(expr),
955 field: name,
956 span,
957 };
958 }
959 }
960 Some(TokenKind::LeftParen) => {
961 let args = self.parse_arguments()?;
962 expr = Expr::Apply {
963 func: Box::new(expr),
964 args,
965 span,
966 };
967 }
968 Some(TokenKind::UnitLiteral) => {
969 self.advance();
970 expr = Expr::Apply {
971 func: Box::new(expr),
972 args: vec![],
973 span,
974 };
975 }
976 Some(TokenKind::LeftBracket) => {
977 self.advance();
978 let mut type_args = Vec::new();
979 while self.peek_kind() != Some(&TokenKind::RightBracket) {
980 type_args.push(self.parse_type()?);
981 if self.peek_kind() == Some(&TokenKind::Comma) {
982 self.advance();
983 } else {
984 break;
985 }
986 }
987 self.expect(&TokenKind::RightBracket)?;
988 expr = Expr::TypeApply {
989 expr: Box::new(expr),
990 type_args,
991 span,
992 };
993 }
994 Some(TokenKind::Match) => {
995 self.advance();
996 let cases = self.parse_match_cases()?;
997 expr = Expr::Match {
998 scrutinee: Box::new(expr),
999 cases,
1000 span,
1001 };
1002 }
1003 _ => break,
1004 }
1005 }
1006 Ok(expr)
1007 }
1008
1009 fn parse_primary(&mut self) -> Result<Expr, ParseError> {
1010 let span = self.current_span();
1011 match self.peek_kind().cloned() {
1012 Some(TokenKind::IntLiteral(v)) => {
1013 self.advance();
1014 Ok(Expr::Literal { value: Literal::Int(v), span })
1015 }
1016 Some(TokenKind::LongLiteral(v)) => {
1017 self.advance();
1018 Ok(Expr::Literal { value: Literal::Long(v), span })
1019 }
1020 Some(TokenKind::DoubleLiteral(v)) => {
1021 self.advance();
1022 Ok(Expr::Literal { value: Literal::Double(v), span })
1023 }
1024 Some(TokenKind::FloatLiteral(v)) => {
1025 self.advance();
1026 Ok(Expr::Literal { value: Literal::Float(v), span })
1027 }
1028 Some(TokenKind::BoolLiteral(b)) => {
1029 self.advance();
1030 Ok(Expr::Literal { value: Literal::Bool(b), span })
1031 }
1032 Some(TokenKind::StringLiteral(s)) => {
1033 self.advance();
1034 Ok(Expr::Literal { value: Literal::String(s), span })
1035 }
1036 Some(TokenKind::CharLiteral(c)) => {
1037 self.advance();
1038 Ok(Expr::Literal { value: Literal::Char(c), span })
1039 }
1040 Some(TokenKind::NullLiteral) => {
1041 self.advance();
1042 Ok(Expr::Literal { value: Literal::Null, span })
1043 }
1044 Some(TokenKind::UnitLiteral) => {
1045 self.advance();
1046 if self.peek_kind() == Some(&TokenKind::Arrow) {
1047 self.advance();
1048 let body = self.parse_expression()?;
1049 return Ok(Expr::Lambda {
1050 params: vec![],
1051 body: Box::new(body),
1052 span,
1053 });
1054 }
1055 Ok(Expr::Literal { value: Literal::Unit, span })
1056 }
1057 Some(TokenKind::Identifier(name)) => {
1058 self.advance();
1059 let name_clone = name.clone();
1060 if self.peek_kind() == Some(&TokenKind::Arrow) {
1061 self.advance();
1062 let body = self.parse_expression()?;
1063 return Ok(Expr::Lambda {
1064 params: vec![Param {
1065 name: name_clone,
1066 type_ann: None,
1067 default: None,
1068 }],
1069 body: Box::new(body),
1070 span,
1071 });
1072 }
1073 Ok(Expr::Identifier { name, span })
1074 }
1075 Some(TokenKind::Underscore) => {
1076 self.advance();
1077 if self.peek_kind() == Some(&TokenKind::Arrow) {
1078 self.advance();
1079 let body = self.parse_expression()?;
1080 return Ok(Expr::Lambda {
1081 params: vec![Param {
1082 name: "_".into(),
1083 type_ann: None,
1084 default: None,
1085 }],
1086 body: Box::new(body),
1087 span,
1088 });
1089 }
1090 Ok(Expr::Identifier { name: "_".into(), span })
1091 }
1092 Some(TokenKind::This) => {
1093 self.advance();
1094 Ok(Expr::This(span))
1095 }
1096 Some(TokenKind::Super) => {
1097 self.advance();
1098 Ok(Expr::Super(span))
1099 }
1100 Some(TokenKind::If) => self.parse_if(),
1101 Some(TokenKind::While) => self.parse_while(),
1102 Some(TokenKind::Do) => self.parse_do_while(),
1103 Some(TokenKind::For) => self.parse_for(),
1104 Some(TokenKind::Return) => {
1105 self.advance();
1106 let value = if !matches!(self.peek_kind(),
1107 Some(TokenKind::Semicolon) |
1108 Some(TokenKind::RightBrace) |
1109 Some(TokenKind::Eof)
1110 ) {
1111 Some(Box::new(self.parse_expression()?))
1112 } else {
1113 None
1114 };
1115 Ok(Expr::Return { value, span })
1116 }
1117 Some(TokenKind::Throw) => {
1118 self.advance();
1119 let value = self.parse_expression()?;
1120 Ok(Expr::Throw { value: Box::new(value), span })
1121 }
1122 Some(TokenKind::Try) => self.parse_try(),
1123 Some(TokenKind::New) => self.parse_new(),
1124 Some(TokenKind::LeftBrace) => self.parse_block(),
1125 Some(TokenKind::LeftParen) => {
1126 self.advance();
1127 if self.peek_kind() == Some(&TokenKind::RightParen) {
1128 self.advance();
1129 if self.peek_kind() == Some(&TokenKind::Arrow) {
1130 self.advance();
1131 let body = self.parse_expression()?;
1132 return Ok(Expr::Lambda {
1133 params: vec![],
1134 body: Box::new(body),
1135 span,
1136 });
1137 }
1138 return Ok(Expr::Literal { value: Literal::Unit, span });
1139 }
1140 let is_typed_params = self.lookahead_typed_params();
1141 if is_typed_params {
1142 let params = self.parse_typed_params_list()?;
1143 self.expect(&TokenKind::RightParen)?;
1144 self.expect(&TokenKind::Arrow)?;
1145 let body = self.parse_expression()?;
1146 return Ok(Expr::Lambda { params, body: Box::new(body), span });
1147 }
1148 let first = self.parse_expression()?;
1149 if self.peek_kind() == Some(&TokenKind::Comma) {
1150 let mut elements = vec![first];
1151 while self.peek_kind() == Some(&TokenKind::Comma) {
1152 self.advance();
1153 elements.push(self.parse_expression()?);
1154 }
1155 self.expect(&TokenKind::RightParen)?;
1156 if self.peek_kind() == Some(&TokenKind::Arrow) {
1157 self.advance();
1158 let body = self.parse_expression()?;
1159 let params: Vec<Param> = elements.iter().map(|e| Param {
1160 name: match e {
1161 Expr::Identifier { name, .. } => name.clone(),
1162 _ => "_".into(),
1163 },
1164 type_ann: None,
1165 default: None,
1166 }).collect();
1167 return Ok(Expr::Lambda { params, body: Box::new(body), span });
1168 }
1169 return Ok(Expr::Tuple { elements, span });
1170 }
1171 self.expect(&TokenKind::RightParen)?;
1172 if self.peek_kind() == Some(&TokenKind::Arrow) {
1173 self.advance();
1174 let body = self.parse_expression()?;
1175 Ok(Expr::Lambda {
1176 params: vec![Param {
1177 name: match &first {
1178 Expr::Identifier { name, .. } => name.clone(),
1179 _ => "_".into(),
1180 },
1181 type_ann: None,
1182 default: None,
1183 }],
1184 body: Box::new(body),
1185 span,
1186 })
1187 } else {
1188 Ok(Expr::Paren { expr: Box::new(first), span })
1189 }
1190 }
1191 Some(TokenKind::Operator(op)) if op == "::" || op == ":+:" || op == "#::" => {
1192 self.advance();
1193 let right = self.parse_postfix()?;
1194 Ok(Expr::MethodCall {
1195 receiver: Box::new(right),
1196 method: op,
1197 args: vec![],
1198 span,
1199 })
1200 }
1201 _ => {
1202 let tok = self.peek().clone();
1203 Err(ParseError::new(
1204 format!("unexpected token: {}", tok.kind),
1205 tok.span,
1206 ))
1207 }
1208 }
1209 }
1210
1211 fn parse_if(&mut self) -> Result<Expr, ParseError> {
1212 let span = self.current_span();
1213 self.advance(); self.expect(&TokenKind::LeftParen)?;
1215 let cond = self.parse_expression()?;
1216 self.expect(&TokenKind::RightParen)?;
1217 let then_branch = self.parse_expression()?;
1218 let else_branch = if self.peek_kind() == Some(&TokenKind::Else) {
1219 self.advance();
1220 Some(Box::new(self.parse_expression()?))
1221 } else {
1222 None
1223 };
1224 Ok(Expr::If {
1225 cond: Box::new(cond),
1226 then_branch: Box::new(then_branch),
1227 else_branch,
1228 span,
1229 })
1230 }
1231
1232 fn parse_while(&mut self) -> Result<Expr, ParseError> {
1233 let span = self.current_span();
1234 self.advance(); self.expect(&TokenKind::LeftParen)?;
1236 let cond = self.parse_expression()?;
1237 self.expect(&TokenKind::RightParen)?;
1238 let body = self.parse_expression()?;
1239 Ok(Expr::While {
1240 cond: Box::new(cond),
1241 body: Box::new(body),
1242 span,
1243 })
1244 }
1245
1246 fn parse_do_while(&mut self) -> Result<Expr, ParseError> {
1247 let span = self.current_span();
1248 self.advance(); let body = self.parse_expression()?;
1250 self.expect(&TokenKind::While)?;
1251 self.expect(&TokenKind::LeftParen)?;
1252 let cond = self.parse_expression()?;
1253 self.expect(&TokenKind::RightParen)?;
1254 Ok(Expr::DoWhile {
1255 body: Box::new(body),
1256 cond: Box::new(cond),
1257 span,
1258 })
1259 }
1260
1261 fn parse_for(&mut self) -> Result<Expr, ParseError> {
1262 let span = self.current_span();
1263 self.advance(); let (enums, _enum_span) = if self.peek_kind() == Some(&TokenKind::LeftBrace) {
1265 self.advance();
1266 let enums = self.parse_enumerators()?;
1267 self.expect(&TokenKind::RightBrace)?;
1268 (enums, span.clone())
1269 } else {
1270 self.expect(&TokenKind::LeftParen)?;
1271 let enums = self.parse_enumerators()?;
1272 self.expect(&TokenKind::RightParen)?;
1273 (enums, span.clone())
1274 };
1275 let is_yield = if self.peek_kind() == Some(&TokenKind::Yield) {
1276 self.advance();
1277 true
1278 } else {
1279 false
1280 };
1281 let body = self.parse_expression()?;
1282 Ok(Expr::For {
1283 enumerators: enums,
1284 body: Box::new(body),
1285 is_yield,
1286 span,
1287 })
1288 }
1289
1290 fn parse_enumerators(&mut self) -> Result<Vec<Enumerator>, ParseError> {
1291 let mut enums = Vec::new();
1292 loop {
1293 let span = self.current_span();
1294 if self.peek_kind() == Some(&TokenKind::Val) {
1295 self.advance();
1296 let pattern = self.parse_pattern()?;
1297 self.expect(&TokenKind::Equals)?;
1298 let expr = self.parse_expression()?;
1299 enums.push(Enumerator::Val { pattern, expr, span });
1300 } else if self.peek_kind() == Some(&TokenKind::If) {
1301 self.advance();
1302 let cond = self.parse_expression()?;
1303 enums.push(Enumerator::Filter { cond, span });
1304 } else {
1305 let pattern = self.parse_pattern()?;
1306 if self.peek_kind() == Some(&TokenKind::LeftArrow) {
1307 self.advance();
1308 let expr = self.parse_expression()?;
1309 enums.push(Enumerator::Generator { pattern, expr, span });
1310 } else {
1311 break;
1312 }
1313 }
1314 let needs_sep = matches!(self.peek_kind(),
1315 Some(TokenKind::Semicolon) | Some(TokenKind::Val) |
1316 Some(TokenKind::If) | Some(TokenKind::Identifier(_)) |
1317 Some(TokenKind::Underscore)
1318 );
1319 if self.peek_kind() == Some(&TokenKind::Semicolon) {
1320 self.advance();
1321 } else if !needs_sep {
1322 break;
1323 }
1324 }
1325 Ok(enums)
1326 }
1327
1328 fn parse_try(&mut self) -> Result<Expr, ParseError> {
1329 let span = self.current_span();
1330 self.advance(); let body = self.parse_expression()?;
1332 let catches = if self.peek_kind() == Some(&TokenKind::Catch) {
1333 self.advance();
1334 self.parse_match_cases()?
1335 } else {
1336 Vec::new()
1337 };
1338 let finally_block = if self.peek_kind() == Some(&TokenKind::Finally) {
1339 self.advance();
1340 Some(Box::new(self.parse_expression()?))
1341 } else {
1342 None
1343 };
1344 Ok(Expr::Try {
1345 body: Box::new(body),
1346 catches,
1347 finally_block,
1348 span,
1349 })
1350 }
1351
1352 fn parse_new(&mut self) -> Result<Expr, ParseError> {
1353 let span = self.current_span();
1354 self.advance(); let (class_name, _) = self.expect_identifier()?;
1356 let type_args = if self.peek_kind() == Some(&TokenKind::LeftBracket) {
1357 self.advance();
1358 let mut args = Vec::new();
1359 while self.peek_kind() != Some(&TokenKind::RightBracket) {
1360 args.push(self.parse_type()?);
1361 if self.peek_kind() == Some(&TokenKind::Comma) {
1362 self.advance();
1363 } else {
1364 break;
1365 }
1366 }
1367 self.expect(&TokenKind::RightBracket)?;
1368 args
1369 } else {
1370 Vec::new()
1371 };
1372 let args = if self.peek_kind() == Some(&TokenKind::LeftParen) {
1373 self.parse_arguments()?
1374 } else {
1375 Vec::new()
1376 };
1377 Ok(Expr::New { class_name, type_args, args, span })
1378 }
1379
1380 fn parse_block(&mut self) -> Result<Expr, ParseError> {
1381 let span = self.current_span();
1382 self.expect(&TokenKind::LeftBrace)?;
1383 let mut stmts = Vec::new();
1384 while self.peek_kind() != Some(&TokenKind::RightBrace) && !self.is_at_end() {
1385 if self.peek_kind() == Some(&TokenKind::Semicolon) {
1386 self.advance();
1387 continue;
1388 }
1389 match self.peek_kind() {
1390 Some(TokenKind::Val) => {
1391 stmts.push(self.parse_val_decl()?);
1392 }
1393 Some(TokenKind::Var) => {
1394 stmts.push(self.parse_var_decl()?);
1395 }
1396 Some(TokenKind::Def) => {
1397 stmts.push(Stmt::DefDecl(self.parse_def_decl()?));
1398 }
1399 Some(TokenKind::Class) | Some(TokenKind::Case) => {
1400 stmts.push(Stmt::ClassDecl(self.parse_class_decl()?));
1401 }
1402 Some(TokenKind::Trait) => {
1403 stmts.push(Stmt::TraitDecl(self.parse_trait_decl()?));
1404 }
1405 Some(TokenKind::Object) => {
1406 stmts.push(Stmt::ObjectDecl(self.parse_object_decl()?));
1407 }
1408 Some(TokenKind::Import) => {
1409 stmts.push(self.parse_import()?);
1410 }
1411 _ => {
1412 stmts.push(Stmt::Expr(self.parse_expression()?));
1413 }
1414 }
1415 self.skip_semicolons();
1416 }
1417 self.expect(&TokenKind::RightBrace)?;
1418 Ok(Expr::Block { stmts, span })
1419 }
1420
1421 fn parse_match_cases(&mut self) -> Result<Vec<MatchCase>, ParseError> {
1422 let expect_brace = self.peek_kind() == Some(&TokenKind::LeftBrace);
1423 if expect_brace {
1424 self.advance();
1425 }
1426 let mut cases = Vec::new();
1427 while !self.is_at_end() {
1428 if expect_brace && self.peek_kind() == Some(&TokenKind::RightBrace) {
1429 self.advance();
1430 break;
1431 }
1432 if self.peek_kind() == Some(&TokenKind::Case) {
1433 self.advance();
1434 } else {
1435 break;
1436 }
1437 let pattern = self.parse_pattern()?;
1438 let guard = if self.peek_kind() == Some(&TokenKind::If) {
1439 self.advance();
1440 Some(self.parse_expression()?)
1441 } else {
1442 None
1443 };
1444 self.expect(&TokenKind::Arrow)?;
1445 let body = self.parse_expression()?;
1446 cases.push(MatchCase {
1447 pattern,
1448 guard,
1449 body,
1450 span: Span::zero(),
1451 });
1452 self.skip_semicolons();
1453 }
1454 Ok(cases)
1455 }
1456
1457 fn parse_pattern(&mut self) -> Result<Pattern, ParseError> {
1458 self.parse_pattern_alternative()
1459 }
1460
1461 fn parse_pattern_alternative(&mut self) -> Result<Pattern, ParseError> {
1462 let span = self.current_span();
1463 let mut pat = self.parse_pattern_base()?;
1464 while self.peek_kind() == Some(&TokenKind::Pipe) {
1465 self.advance();
1466 let right = self.parse_pattern_base()?;
1467 pat = Pattern::Alternative {
1468 left: Box::new(pat),
1469 right: Box::new(right),
1470 span,
1471 };
1472 }
1473 Ok(pat)
1474 }
1475
1476 fn parse_pattern_base(&mut self) -> Result<Pattern, ParseError> {
1477 let span = self.current_span();
1478 match self.peek_kind().cloned() {
1479 Some(TokenKind::Underscore) => {
1480 self.advance();
1481 Ok(Pattern::Wildcard(span))
1482 }
1483 Some(TokenKind::IntLiteral(v)) => {
1484 self.advance();
1485 Ok(Pattern::Literal { value: Literal::Int(v), span })
1486 }
1487 Some(TokenKind::LongLiteral(v)) => {
1488 self.advance();
1489 Ok(Pattern::Literal { value: Literal::Long(v), span })
1490 }
1491 Some(TokenKind::DoubleLiteral(v)) => {
1492 self.advance();
1493 Ok(Pattern::Literal { value: Literal::Double(v), span })
1494 }
1495 Some(TokenKind::FloatLiteral(v)) => {
1496 self.advance();
1497 Ok(Pattern::Literal { value: Literal::Float(v), span })
1498 }
1499 Some(TokenKind::BoolLiteral(b)) => {
1500 self.advance();
1501 Ok(Pattern::Literal { value: Literal::Bool(b), span })
1502 }
1503 Some(TokenKind::StringLiteral(s)) => {
1504 self.advance();
1505 Ok(Pattern::Literal { value: Literal::String(s), span })
1506 }
1507 Some(TokenKind::CharLiteral(c)) => {
1508 self.advance();
1509 Ok(Pattern::Literal { value: Literal::Char(c), span })
1510 }
1511 Some(TokenKind::NullLiteral) => {
1512 self.advance();
1513 Ok(Pattern::Literal { value: Literal::Null, span })
1514 }
1515 Some(TokenKind::Minus) => {
1516 self.advance();
1517 match self.peek_kind().cloned() {
1518 Some(TokenKind::IntLiteral(v)) => {
1519 self.advance();
1520 Ok(Pattern::Literal { value: Literal::Int(-v), span })
1521 }
1522 Some(TokenKind::DoubleLiteral(v)) => {
1523 self.advance();
1524 Ok(Pattern::Literal { value: Literal::Double(-v), span })
1525 }
1526 _ => Err(ParseError::new("expected number after '-'", self.current_span())),
1527 }
1528 }
1529 Some(TokenKind::Identifier(name)) => {
1530 self.advance();
1531 let name_clone = name.clone();
1532 if self.peek_kind() == Some(&TokenKind::LeftParen) {
1533 self.advance();
1534 let mut args = Vec::new();
1535 while self.peek_kind() != Some(&TokenKind::RightParen) {
1536 if self.peek_kind() == Some(&TokenKind::Underscore) && self.peek_at(1).kind == TokenKind::Star {
1537 self.advance();
1538 self.advance();
1539 args.push(Pattern::SequenceWildcard(self.current_span()));
1540 } else {
1541 args.push(self.parse_pattern()?);
1542 }
1543 if self.peek_kind() == Some(&TokenKind::Comma) {
1544 self.advance();
1545 } else {
1546 break;
1547 }
1548 }
1549 self.expect(&TokenKind::RightParen)?;
1550 Ok(Pattern::Constructor { name, args, span })
1551 } else if self.peek_kind() == Some(&TokenKind::Colon) {
1552 self.advance();
1553 let type_ann = self.parse_type()?;
1554 Ok(Pattern::Typed {
1555 pattern: Box::new(Pattern::Variable { name: name_clone, span: span.clone() }),
1556 type_ann,
1557 span,
1558 })
1559 } else {
1560 Ok(Pattern::Variable { name, span })
1561 }
1562 }
1563 Some(TokenKind::LeftParen) => {
1564 self.advance();
1565 if self.peek_kind() == Some(&TokenKind::RightParen) {
1566 self.advance();
1567 return Ok(Pattern::Tuple { elements: vec![], span });
1568 }
1569 let first = self.parse_pattern()?;
1570 if self.peek_kind() == Some(&TokenKind::Comma) {
1571 let mut elements = vec![first];
1572 while self.peek_kind() == Some(&TokenKind::Comma) {
1573 self.advance();
1574 elements.push(self.parse_pattern()?);
1575 }
1576 self.expect(&TokenKind::RightParen)?;
1577 Ok(Pattern::Tuple { elements, span })
1578 } else {
1579 self.expect(&TokenKind::RightParen)?;
1580 Ok(first)
1581 }
1582 }
1583 _ => Err(ParseError::new(
1584 format!("unexpected token in pattern: {}", self.peek().kind),
1585 self.current_span(),
1586 )),
1587 }
1588 }
1589}
1590
1591#[cfg(test)]
1592mod tests {
1593 use super::*;
1594 use crate::lexer::Lexer;
1595
1596 fn parse_stmts(source: &str) -> Vec<Stmt> {
1597 let tokens = Lexer::tokenize(source).unwrap();
1598 Parser::parse(tokens).unwrap()
1599 }
1600
1601 fn parse_one_expr(source: &str) -> Expr {
1602 let tokens = Lexer::tokenize(source).unwrap();
1603 Parser::parse_expr(tokens).unwrap()
1604 }
1605
1606 #[test]
1607 fn test_literal_int() {
1608 if let Expr::Literal { value: Literal::Int(42), .. } = parse_one_expr("42") {
1609 } else {
1610 panic!("expected int literal 42");
1611 }
1612 }
1613
1614 #[test]
1615 fn test_binary_add() {
1616 if let Expr::Binary { op: BinOp::Add, .. } = parse_one_expr("1 + 2") {
1617 } else {
1618 panic!("expected binary add");
1619 }
1620 }
1621
1622 #[test]
1623 fn test_precedence() {
1624 if let Expr::Binary { op: BinOp::Add, left: _, right, .. } = parse_one_expr("1 + 2 * 3") {
1625 if let Expr::Binary { op: BinOp::Mul, .. } = *right {
1626 } else {
1627 panic!("expected mul on right");
1628 }
1629 } else {
1630 panic!("expected binary add");
1631 }
1632 }
1633
1634 #[test]
1635 fn test_if_else() {
1636 match parse_one_expr("if (true) 1 else 2") {
1637 Expr::If { .. } => {}
1638 _ => panic!("expected if expression"),
1639 }
1640 }
1641
1642 #[test]
1643 fn test_block() {
1644 match parse_one_expr("{ val x = 1; x }") {
1645 Expr::Block { stmts, .. } => assert_eq!(stmts.len(), 2),
1646 _ => panic!("expected block"),
1647 }
1648 }
1649
1650 #[test]
1651 fn test_lambda() {
1652 match parse_one_expr("(x) => x + 1") {
1653 Expr::Lambda { params, .. } => assert_eq!(params.len(), 1),
1654 _ => panic!("expected lambda"),
1655 }
1656 }
1657
1658 #[test]
1659 fn test_val_decl() {
1660 let stmts = parse_stmts("val x = 42");
1661 match &stmts[0] {
1662 Stmt::ValDecl { pattern, value, .. } => {
1663 if let Pattern::Variable { name, .. } = pattern {
1664 assert_eq!(name, "x");
1665 }
1666 if let Expr::Literal { value: Literal::Int(42), .. } = value {
1667 } else {
1668 panic!("expected int 42");
1669 }
1670 }
1671 _ => panic!("expected val decl"),
1672 }
1673 }
1674
1675 #[test]
1676 fn test_def_decl() {
1677 let stmts = parse_stmts("def add(a: Int, b: Int): Int = a + b");
1678 match &stmts[0] {
1679 Stmt::DefDecl(DefDecl { name, params, return_type, .. }) => {
1680 assert_eq!(name, "add");
1681 assert_eq!(params.len(), 2);
1682 assert!(return_type.is_some());
1683 }
1684 _ => panic!("expected def decl"),
1685 }
1686 }
1687
1688 #[test]
1689 fn test_class_decl() {
1690 let stmts = parse_stmts("class Point(val x: Int, val y: Int)");
1691 match &stmts[0] {
1692 Stmt::ClassDecl(ClassDecl { name, ctor_params, .. }) => {
1693 assert_eq!(name, "Point");
1694 assert_eq!(ctor_params.len(), 2);
1695 }
1696 _ => panic!("expected class decl"),
1697 }
1698 }
1699
1700 #[test]
1701 fn test_case_class() {
1702 let stmts = parse_stmts("case class Foo(x: Int, y: String)");
1703 match &stmts[0] {
1704 Stmt::ClassDecl(ClassDecl { name, is_case, .. }) => {
1705 assert_eq!(name, "Foo");
1706 assert!(is_case);
1707 }
1708 _ => panic!("expected case class"),
1709 }
1710 }
1711
1712 #[test]
1713 fn test_match_expr() {
1714 match parse_one_expr("x match { case 0 => 1 case _ => 2 }") {
1715 Expr::Match { cases, .. } => assert_eq!(cases.len(), 2),
1716 _ => panic!("expected match"),
1717 }
1718 }
1719
1720 #[test]
1721 fn test_method_call() {
1722 match parse_one_expr("obj.method(1, 2)") {
1723 Expr::MethodCall { method, args, .. } => {
1724 assert_eq!(method, "method");
1725 assert_eq!(args.len(), 2);
1726 }
1727 _ => panic!("expected method call"),
1728 }
1729 }
1730
1731 #[test]
1732 fn test_tuple() {
1733 match parse_one_expr("(1, 2, 3)") {
1734 Expr::Tuple { elements, .. } => assert_eq!(elements.len(), 3),
1735 _ => panic!("expected tuple"),
1736 }
1737 }
1738
1739 #[test]
1740 fn test_new_expr() {
1741 match parse_one_expr("new Point(1, 2)") {
1742 Expr::New { class_name, args, .. } => {
1743 assert_eq!(class_name, "Point");
1744 assert_eq!(args.len(), 2);
1745 }
1746 _ => panic!("expected new"),
1747 }
1748 }
1749
1750 #[test]
1751 fn test_for_comprehension() {
1752 match parse_one_expr("for (x <- List(1, 2)) yield x") {
1753 Expr::For { is_yield, enumerators, .. } => {
1754 assert!(is_yield);
1755 assert_eq!(enumerators.len(), 1);
1756 }
1757 _ => panic!("expected for"),
1758 }
1759 }
1760
1761 #[test]
1762 fn test_trait_decl() {
1763 let stmts = parse_stmts("trait Greeter { def greet(name: String): String }");
1764 match &stmts[0] {
1765 Stmt::TraitDecl(TraitDecl { name, body, .. }) => {
1766 assert_eq!(name, "Greeter");
1767 assert_eq!(body.len(), 1);
1768 }
1769 _ => panic!("expected trait"),
1770 }
1771 }
1772
1773 #[test]
1774 fn test_object_decl() {
1775 let stmts = parse_stmts("object Math { def square(x: Int): Int = x * x }");
1776 match &stmts[0] {
1777 Stmt::ObjectDecl(ObjectDecl { name, body, .. }) => {
1778 assert_eq!(name, "Math");
1779 assert_eq!(body.len(), 1);
1780 }
1781 _ => panic!("expected object"),
1782 }
1783 }
1784
1785 #[test]
1786 fn test_type_param() {
1787 let stmts = parse_stmts("class Box[T](val content: T)");
1788 match &stmts[0] {
1789 Stmt::ClassDecl(ClassDecl { name, type_params, .. }) => {
1790 assert_eq!(name, "Box");
1791 assert_eq!(type_params.len(), 1);
1792 }
1793 _ => panic!("expected class"),
1794 }
1795 }
1796}