1use crate::ast::*;
6use crate::lexer::{Lexer, Token};
7use crate::span::{Span, Spanned};
8use thiserror::Error;
9
10#[derive(Error, Debug)]
11pub enum ParseError {
12 #[error("Unexpected token: expected {expected}, found {found:?} at {span}")]
13 UnexpectedToken {
14 expected: String,
15 found: Token,
16 span: Span,
17 },
18 #[error("Unexpected end of file")]
19 UnexpectedEof,
20 #[error("Invalid number literal: {0}")]
21 InvalidNumber(String),
22 #[error("Parse error: {0}")]
23 Custom(String),
24}
25
26pub type ParseResult<T> = Result<T, ParseError>;
27
28pub struct Parser<'a> {
30 lexer: Lexer<'a>,
31 current: Option<(Token, Span)>,
32 in_condition: bool,
34}
35
36impl<'a> Parser<'a> {
37 pub fn new(source: &'a str) -> Self {
38 let mut lexer = Lexer::new(source);
39 let current = lexer.next_token();
40 Self { lexer, current, in_condition: false }
41 }
42
43 pub fn parse_file(&mut self) -> ParseResult<SourceFile> {
45 let mut attrs = Vec::new();
47 while matches!(self.current_token(), Some(Token::HashBang)) {
48 attrs.push(self.parse_inner_attribute()?);
49 }
50
51 let config = self.build_crate_config(&attrs);
53
54 let mut items = Vec::new();
55 while !self.is_eof() {
56 while matches!(self.current_token(), Some(Token::LineComment(_) | Token::DocComment(_))) {
58 self.advance();
59 }
60 if self.is_eof() {
61 break;
62 }
63 items.push(self.parse_item()?);
64 }
65 Ok(SourceFile { attrs, config, items })
66 }
67
68 fn parse_inner_attribute(&mut self) -> ParseResult<Attribute> {
70 self.expect(Token::HashBang)?;
71 self.expect(Token::LBracket)?;
72
73 let name = self.parse_ident()?;
74 let args = self.parse_attr_args()?;
75
76 self.expect(Token::RBracket)?;
77
78 Ok(Attribute {
79 name,
80 args,
81 is_inner: true,
82 })
83 }
84
85 fn parse_outer_attribute(&mut self) -> ParseResult<Attribute> {
87 self.expect(Token::Hash)?;
88 self.expect(Token::LBracket)?;
89
90 let name = self.parse_attr_name()?;
91 let args = self.parse_attr_args()?;
92
93 self.expect(Token::RBracket)?;
94
95 Ok(Attribute {
96 name,
97 args,
98 is_inner: false,
99 })
100 }
101
102 fn parse_attr_name(&mut self) -> ParseResult<Ident> {
104 let span = self.current_span();
105 match self.current_token().cloned() {
106 Some(Token::Ident(name)) => {
107 self.advance();
108 Ok(Ident { name, evidentiality: None, affect: None, span })
109 }
110 Some(Token::Naked) => {
112 self.advance();
113 Ok(Ident { name: "naked".to_string(), evidentiality: None, affect: None, span })
114 }
115 Some(Token::Unsafe) => {
116 self.advance();
117 Ok(Ident { name: "unsafe".to_string(), evidentiality: None, affect: None, span })
118 }
119 Some(Token::Asm) => {
120 self.advance();
121 Ok(Ident { name: "asm".to_string(), evidentiality: None, affect: None, span })
122 }
123 Some(Token::Volatile) => {
124 self.advance();
125 Ok(Ident { name: "volatile".to_string(), evidentiality: None, affect: None, span })
126 }
127 Some(Token::Derive) => {
128 self.advance();
129 Ok(Ident { name: "derive".to_string(), evidentiality: None, affect: None, span })
130 }
131 Some(Token::Simd) => {
132 self.advance();
133 Ok(Ident { name: "simd".to_string(), evidentiality: None, affect: None, span })
134 }
135 Some(Token::Atomic) => {
136 self.advance();
137 Ok(Ident { name: "atomic".to_string(), evidentiality: None, affect: None, span })
138 }
139 Some(t) => Err(ParseError::UnexpectedToken {
140 expected: "attribute name".to_string(),
141 found: t,
142 span,
143 }),
144 None => Err(ParseError::UnexpectedEof),
145 }
146 }
147
148 fn parse_attr_args(&mut self) -> ParseResult<Option<AttrArgs>> {
150 if self.consume_if(&Token::LParen) {
151 let mut args = Vec::new();
152
153 while !self.check(&Token::RParen) {
154 args.push(self.parse_attr_arg()?);
155 if !self.consume_if(&Token::Comma) {
156 break;
157 }
158 }
159
160 self.expect(Token::RParen)?;
161 Ok(Some(AttrArgs::Paren(args)))
162 } else if self.consume_if(&Token::Eq) {
163 let expr = self.parse_expr()?;
164 Ok(Some(AttrArgs::Eq(Box::new(expr))))
165 } else {
166 Ok(None)
167 }
168 }
169
170 fn parse_attr_arg(&mut self) -> ParseResult<AttrArg> {
172 match self.current_token().cloned() {
173 Some(Token::StringLit(s)) => {
174 self.advance();
175 Ok(AttrArg::Literal(Literal::String(s)))
176 }
177 Some(Token::IntLit(s)) => {
178 self.advance();
179 Ok(AttrArg::Literal(Literal::Int {
180 value: s,
181 base: NumBase::Decimal,
182 suffix: None,
183 }))
184 }
185 Some(Token::HexLit(s)) => {
186 self.advance();
187 Ok(AttrArg::Literal(Literal::Int {
188 value: s,
189 base: NumBase::Hex,
190 suffix: None,
191 }))
192 }
193 Some(Token::BinaryLit(s)) => {
194 self.advance();
195 Ok(AttrArg::Literal(Literal::Int {
196 value: s,
197 base: NumBase::Binary,
198 suffix: None,
199 }))
200 }
201 Some(Token::OctalLit(s)) => {
202 self.advance();
203 Ok(AttrArg::Literal(Literal::Int {
204 value: s,
205 base: NumBase::Octal,
206 suffix: None,
207 }))
208 }
209 Some(Token::Ident(_)) => {
210 let ident = self.parse_ident()?;
211 self.parse_attr_arg_after_ident(ident)
212 }
213 Some(Token::Asm) => {
215 let span = self.current_span();
216 self.advance();
217 let ident = Ident { name: "asm".to_string(), evidentiality: None, affect: None, span };
218 self.parse_attr_arg_after_ident(ident)
219 }
220 Some(Token::Volatile) => {
221 let span = self.current_span();
222 self.advance();
223 let ident = Ident { name: "volatile".to_string(), evidentiality: None, affect: None, span };
224 self.parse_attr_arg_after_ident(ident)
225 }
226 Some(Token::Naked) => {
227 let span = self.current_span();
228 self.advance();
229 let ident = Ident { name: "naked".to_string(), evidentiality: None, affect: None, span };
230 self.parse_attr_arg_after_ident(ident)
231 }
232 Some(Token::Packed) => {
233 let span = self.current_span();
234 self.advance();
235 let ident = Ident { name: "packed".to_string(), evidentiality: None, affect: None, span };
236 self.parse_attr_arg_after_ident(ident)
237 }
238 Some(Token::Unsafe) => {
239 let span = self.current_span();
240 self.advance();
241 let ident = Ident { name: "unsafe".to_string(), evidentiality: None, affect: None, span };
242 self.parse_attr_arg_after_ident(ident)
243 }
244 Some(t) => Err(ParseError::UnexpectedToken {
245 expected: "attribute argument".to_string(),
246 found: t,
247 span: self.current_span(),
248 }),
249 None => Err(ParseError::UnexpectedEof),
250 }
251 }
252
253 fn parse_attr_arg_after_ident(&mut self, ident: Ident) -> ParseResult<AttrArg> {
255 if self.consume_if(&Token::Eq) {
257 let value = self.parse_expr()?;
258 Ok(AttrArg::KeyValue {
259 key: ident,
260 value: Box::new(value),
261 })
262 }
263 else if self.check(&Token::LParen) {
265 let args = self.parse_attr_args()?;
266 Ok(AttrArg::Nested(Attribute {
267 name: ident,
268 args,
269 is_inner: false,
270 }))
271 }
272 else {
274 Ok(AttrArg::Ident(ident))
275 }
276 }
277
278 fn parse_interpolation_parts(&mut self, s: &str) -> ParseResult<Vec<InterpolationPart>> {
281 let mut parts = Vec::new();
282 let mut current_text = String::new();
283 let mut chars = s.chars().peekable();
284 let mut brace_depth = 0;
285 let mut expr_content = String::new();
286 let mut in_expr = false;
287
288 while let Some(c) = chars.next() {
289 if in_expr {
290 if c == '{' {
291 brace_depth += 1;
292 expr_content.push(c);
293 } else if c == '}' {
294 if brace_depth > 0 {
295 brace_depth -= 1;
296 expr_content.push(c);
297 } else {
298 in_expr = false;
300 if !expr_content.is_empty() {
301 let mut expr_parser = Parser::new(&expr_content);
303 match expr_parser.parse_expr() {
304 Ok(expr) => {
305 parts.push(InterpolationPart::Expr(Box::new(expr)));
306 }
307 Err(_) => {
308 parts.push(InterpolationPart::Text(format!("{{{}}}", expr_content)));
310 }
311 }
312 }
313 expr_content.clear();
314 }
315 } else {
316 expr_content.push(c);
317 }
318 } else if c == '{' {
319 if chars.peek() == Some(&'{') {
320 chars.next();
322 current_text.push('{');
323 } else {
324 if !current_text.is_empty() {
326 parts.push(InterpolationPart::Text(current_text.clone()));
327 current_text.clear();
328 }
329 in_expr = true;
330 }
331 } else if c == '}' {
332 if chars.peek() == Some(&'}') {
333 chars.next();
335 current_text.push('}');
336 } else {
337 current_text.push(c);
338 }
339 } else {
340 current_text.push(c);
341 }
342 }
343
344 if !current_text.is_empty() {
346 parts.push(InterpolationPart::Text(current_text));
347 }
348
349 if parts.is_empty() {
351 parts.push(InterpolationPart::Text(String::new()));
352 }
353
354 Ok(parts)
355 }
356
357 fn build_crate_config(&self, attrs: &[Attribute]) -> CrateConfig {
359 let mut config = CrateConfig::default();
360 let mut linker = LinkerConfig::default();
361 let mut has_linker_config = false;
362
363 for attr in attrs {
364 match attr.name.name.as_str() {
365 "no_std" => config.no_std = true,
366 "no_main" => config.no_main = true,
367 "feature" => {
368 if let Some(AttrArgs::Paren(args)) = &attr.args {
369 for arg in args {
370 if let AttrArg::Ident(ident) = arg {
371 config.features.push(ident.name.clone());
372 }
373 }
374 }
375 }
376 "target" => {
377 let mut target = TargetConfig::default();
378 if let Some(AttrArgs::Paren(args)) = &attr.args {
379 for arg in args {
380 if let AttrArg::KeyValue { key, value } = arg {
381 if let Expr::Literal(Literal::String(s)) = value.as_ref() {
382 match key.name.as_str() {
383 "arch" => target.arch = Some(s.clone()),
384 "os" => target.os = Some(s.clone()),
385 "abi" => target.abi = Some(s.clone()),
386 _ => {}
387 }
388 }
389 }
390 }
391 }
392 config.target = Some(target);
393 }
394 "linker_script" => {
396 if let Some(AttrArgs::Eq(value)) = &attr.args {
397 if let Expr::Literal(Literal::String(s)) = value.as_ref() {
398 linker.script = Some(s.clone());
399 has_linker_config = true;
400 }
401 }
402 }
403 "entry_point" => {
404 if let Some(AttrArgs::Eq(value)) = &attr.args {
405 if let Expr::Literal(Literal::String(s)) = value.as_ref() {
406 linker.entry_point = Some(s.clone());
407 has_linker_config = true;
408 }
409 }
410 }
411 "base_address" => {
412 if let Some(AttrArgs::Eq(value)) = &attr.args {
413 if let Expr::Literal(Literal::Int { value: s, base, .. }) = value.as_ref() {
414 let addr = Self::parse_int_value(s, *base);
415 linker.base_address = Some(addr);
416 has_linker_config = true;
417 }
418 }
419 }
420 "stack_size" => {
421 if let Some(AttrArgs::Eq(value)) = &attr.args {
422 if let Expr::Literal(Literal::Int { value: s, base, .. }) = value.as_ref() {
423 let size = Self::parse_int_value(s, *base);
424 linker.stack_size = Some(size);
425 has_linker_config = true;
426 }
427 }
428 }
429 "link" => {
430 if let Some(AttrArgs::Paren(args)) = &attr.args {
432 for arg in args {
433 if let AttrArg::KeyValue { key, value } = arg {
434 if key.name == "flag" {
435 if let Expr::Literal(Literal::String(s)) = value.as_ref() {
436 linker.flags.push(s.clone());
437 has_linker_config = true;
438 }
439 }
440 }
441 }
442 }
443 }
444 _ => {}
445 }
446 }
447
448 if has_linker_config {
449 config.linker = Some(linker);
450 }
451
452 config
453 }
454
455 fn parse_int_value(s: &str, base: NumBase) -> u64 {
457 let (stripped, radix) = match base {
459 NumBase::Binary => (s.strip_prefix("0b").or(s.strip_prefix("0B")).unwrap_or(s), 2),
460 NumBase::Octal => (s.strip_prefix("0o").or(s.strip_prefix("0O")).unwrap_or(s), 8),
461 NumBase::Decimal => (s, 10),
462 NumBase::Hex => (s.strip_prefix("0x").or(s.strip_prefix("0X")).unwrap_or(s), 16),
463 NumBase::Vigesimal => (s.strip_prefix("0v").or(s.strip_prefix("0V")).unwrap_or(s), 20),
464 NumBase::Duodecimal => (s.strip_prefix("0d").or(s.strip_prefix("0D")).unwrap_or(s), 12),
465 NumBase::Sexagesimal => (s.strip_prefix("0s").or(s.strip_prefix("0S")).unwrap_or(s), 60),
466 NumBase::Explicit(r) => (s, r as u32),
467 };
468 let clean: String = stripped.chars().filter(|c| *c != '_').collect();
470 u64::from_str_radix(&clean, radix).unwrap_or(0)
471 }
472
473 fn current_token(&self) -> Option<&Token> {
476 self.current.as_ref().map(|(t, _)| t)
477 }
478
479 fn current_span(&self) -> Span {
480 self.current.as_ref().map(|(_, s)| *s).unwrap_or_default()
481 }
482
483 fn advance(&mut self) -> Option<(Token, Span)> {
484 let prev = self.current.take();
485 self.current = self.lexer.next_token();
486 prev
487 }
488
489 fn is_eof(&self) -> bool {
490 self.current.is_none()
491 }
492
493 fn expect(&mut self, expected: Token) -> ParseResult<Span> {
494 match &self.current {
495 Some((token, span)) if std::mem::discriminant(token) == std::mem::discriminant(&expected) => {
496 let span = *span;
497 self.advance();
498 Ok(span)
499 }
500 Some((token, span)) => Err(ParseError::UnexpectedToken {
501 expected: format!("{:?}", expected),
502 found: token.clone(),
503 span: *span,
504 }),
505 None => Err(ParseError::UnexpectedEof),
506 }
507 }
508
509 fn check(&self, expected: &Token) -> bool {
510 matches!(&self.current, Some((token, _)) if std::mem::discriminant(token) == std::mem::discriminant(expected))
511 }
512
513 fn peek_next(&mut self) -> Option<&Token> {
515 self.lexer.peek().map(|(t, _)| t)
516 }
517
518 fn consume_if(&mut self, expected: &Token) -> bool {
519 if self.check(expected) {
520 self.advance();
521 true
522 } else {
523 false
524 }
525 }
526
527 fn skip_comments(&mut self) {
529 while matches!(self.current_token(), Some(Token::LineComment(_)) | Some(Token::DocComment(_))) {
530 self.advance();
531 }
532 }
533
534 fn parse_item(&mut self) -> ParseResult<Spanned<Item>> {
537 let start_span = self.current_span();
538
539 let mut outer_attrs = Vec::new();
541 while self.check(&Token::Hash) {
542 outer_attrs.push(self.parse_outer_attribute()?);
543 }
544
545 let visibility = self.parse_visibility()?;
546
547 let item = match self.current_token() {
548 Some(Token::Fn) | Some(Token::Async) => {
549 Item::Function(self.parse_function_with_attrs(visibility, outer_attrs)?)
550 }
551 Some(Token::Struct) => {
552 Item::Struct(self.parse_struct_with_attrs(visibility, outer_attrs)?)
553 }
554 Some(Token::Enum) => {
555 Item::Enum(self.parse_enum(visibility)?)
556 }
557 Some(Token::Trait) => {
558 Item::Trait(self.parse_trait(visibility)?)
559 }
560 Some(Token::Impl) => {
561 Item::Impl(self.parse_impl()?)
562 }
563 Some(Token::Type) => {
564 Item::TypeAlias(self.parse_type_alias(visibility)?)
565 }
566 Some(Token::Mod) => {
567 Item::Module(self.parse_module(visibility)?)
568 }
569 Some(Token::Use) => {
570 Item::Use(self.parse_use(visibility)?)
571 }
572 Some(Token::Const) => {
573 Item::Const(self.parse_const(visibility)?)
574 }
575 Some(Token::Static) => {
576 Item::Static(self.parse_static(visibility)?)
577 }
578 Some(Token::Actor) => {
579 Item::Actor(self.parse_actor(visibility)?)
580 }
581 Some(Token::Extern) => {
582 Item::ExternBlock(self.parse_extern_block()?)
583 }
584 Some(Token::Naked) => {
585 Item::Function(self.parse_function_with_attrs(visibility, outer_attrs)?)
587 }
588 Some(Token::Packed) => {
589 Item::Struct(self.parse_struct_with_attrs(visibility, outer_attrs)?)
591 }
592 Some(token) => {
593 return Err(ParseError::UnexpectedToken {
594 expected: "item".to_string(),
595 found: token.clone(),
596 span: self.current_span(),
597 });
598 }
599 None => return Err(ParseError::UnexpectedEof),
600 };
601
602 let end_span = self.current_span();
603 Ok(Spanned::new(item, start_span.merge(end_span)))
604 }
605
606 fn parse_visibility(&mut self) -> ParseResult<Visibility> {
607 if self.consume_if(&Token::Pub) {
608 Ok(Visibility::Public)
609 } else {
610 Ok(Visibility::Private)
611 }
612 }
613
614 fn parse_function(&mut self, visibility: Visibility) -> ParseResult<Function> {
615 self.parse_function_with_attrs(visibility, Vec::new())
616 }
617
618 fn parse_function_with_attrs(&mut self, visibility: Visibility, outer_attrs: Vec<Attribute>) -> ParseResult<Function> {
619 let mut attrs = self.process_function_attrs(&outer_attrs);
621
622 if self.consume_if(&Token::Naked) {
624 attrs.naked = true;
625 }
626
627 let is_async = self.consume_if(&Token::Async);
628 self.expect(Token::Fn)?;
629
630 let name = self.parse_ident()?;
631
632 let aspect = match self.current_token() {
634 Some(Token::AspectProgressive) => {
635 self.advance();
636 Some(Aspect::Progressive)
637 }
638 Some(Token::AspectPerfective) => {
639 self.advance();
640 Some(Aspect::Perfective)
641 }
642 Some(Token::AspectPotential) => {
643 self.advance();
644 Some(Aspect::Potential)
645 }
646 Some(Token::AspectResultative) => {
647 self.advance();
648 Some(Aspect::Resultative)
649 }
650 _ => None,
651 };
652
653 let generics = self.parse_generics_opt()?;
654
655 self.expect(Token::LParen)?;
656 let params = self.parse_params()?;
657 self.expect(Token::RParen)?;
658
659 let return_type = if self.consume_if(&Token::Arrow) {
660 Some(self.parse_type()?)
661 } else {
662 None
663 };
664
665 let where_clause = self.parse_where_clause_opt()?;
666
667 let body = if self.check(&Token::LBrace) {
668 Some(self.parse_block()?)
669 } else {
670 self.expect(Token::Semi)?;
671 None
672 };
673
674 Ok(Function {
675 visibility,
676 is_async,
677 attrs,
678 name,
679 aspect,
680 generics,
681 params,
682 return_type,
683 where_clause,
684 body,
685 })
686 }
687
688 fn process_function_attrs(&self, attrs: &[Attribute]) -> FunctionAttrs {
690 let mut func_attrs = FunctionAttrs::default();
691
692 for attr in attrs {
693 match attr.name.name.as_str() {
694 "panic_handler" => func_attrs.panic_handler = true,
695 "entry" => func_attrs.entry = true,
696 "no_mangle" => func_attrs.no_mangle = true,
697 "export" => func_attrs.export = true,
698 "cold" => func_attrs.cold = true,
699 "hot" => func_attrs.hot = true,
700 "test" => func_attrs.test = true,
701 "naked" => func_attrs.naked = true,
702 "inline" => {
703 func_attrs.inline = Some(match &attr.args {
704 Some(AttrArgs::Paren(args)) => {
705 if let Some(AttrArg::Ident(ident)) = args.first() {
706 match ident.name.as_str() {
707 "always" => InlineHint::Always,
708 "never" => InlineHint::Never,
709 _ => InlineHint::Hint,
710 }
711 } else {
712 InlineHint::Hint
713 }
714 }
715 _ => InlineHint::Hint,
716 });
717 }
718 "link_section" => {
719 if let Some(AttrArgs::Eq(value)) = &attr.args {
720 if let Expr::Literal(Literal::String(s)) = value.as_ref() {
721 func_attrs.link_section = Some(s.clone());
722 }
723 }
724 }
725 "interrupt" => {
726 if let Some(AttrArgs::Paren(args)) = &attr.args {
727 if let Some(AttrArg::Literal(Literal::Int { value, base, .. })) = args.first() {
728 let num = Self::parse_int_value(value, *base) as u32;
729 func_attrs.interrupt = Some(num);
730 }
731 }
732 }
733 "align" => {
734 if let Some(AttrArgs::Paren(args)) = &attr.args {
735 if let Some(AttrArg::Literal(Literal::Int { value, base, .. })) = args.first() {
736 let align = Self::parse_int_value(value, *base) as usize;
737 func_attrs.align = Some(align);
738 }
739 }
740 }
741 _ => {
742 func_attrs.outer_attrs.push(attr.clone());
744 }
745 }
746 }
747
748 func_attrs
749 }
750
751 fn parse_struct_with_attrs(&mut self, visibility: Visibility, outer_attrs: Vec<Attribute>) -> ParseResult<StructDef> {
752 let mut attrs = StructAttrs::default();
754 attrs.outer_attrs = outer_attrs.clone();
755
756 for attr in &outer_attrs {
758 if attr.name.name == "derive" {
759 if let Some(AttrArgs::Paren(args)) = &attr.args {
760 for arg in args {
761 if let AttrArg::Ident(ident) = arg {
762 let derive = Self::parse_derive_trait(&ident.name)?;
763 attrs.derives.push(derive);
764 }
765 }
766 }
767 } else if attr.name.name == "simd" {
768 attrs.simd = true;
769 } else if attr.name.name == "repr" {
770 if let Some(AttrArgs::Paren(args)) = &attr.args {
771 for arg in args {
772 if let AttrArg::Ident(ident) = arg {
773 attrs.repr = Some(match ident.name.as_str() {
774 "C" => StructRepr::C,
775 "transparent" => StructRepr::Transparent,
776 "packed" => {
777 attrs.packed = true;
778 StructRepr::C }
780 other => StructRepr::Int(other.to_string()),
781 });
782 } else if let AttrArg::Nested(nested) = arg {
783 if nested.name.name == "align" {
784 if let Some(AttrArgs::Paren(align_args)) = &nested.args {
785 if let Some(AttrArg::Literal(Literal::Int { value, .. })) = align_args.first() {
786 if let Ok(n) = value.parse::<usize>() {
787 attrs.align = Some(n);
788 }
789 }
790 }
791 }
792 }
793 }
794 }
795 }
796 }
797
798 if self.consume_if(&Token::Packed) {
800 attrs.packed = true;
801 }
802
803 self.expect(Token::Struct)?;
804 let name = self.parse_ident()?;
805 let generics = self.parse_generics_opt()?;
806
807 let fields = if self.check(&Token::LBrace) {
808 self.expect(Token::LBrace)?;
809 let fields = self.parse_field_defs()?;
810 self.expect(Token::RBrace)?;
811 StructFields::Named(fields)
812 } else if self.check(&Token::LParen) {
813 self.expect(Token::LParen)?;
814 let types = self.parse_type_list()?;
815 self.expect(Token::RParen)?;
816 self.expect(Token::Semi)?;
817 StructFields::Tuple(types)
818 } else {
819 self.expect(Token::Semi)?;
820 StructFields::Unit
821 };
822
823 Ok(StructDef {
824 visibility,
825 attrs,
826 name,
827 generics,
828 fields,
829 })
830 }
831
832 fn parse_derive_trait(name: &str) -> ParseResult<DeriveTrait> {
833 match name {
834 "Debug" => Ok(DeriveTrait::Debug),
835 "Clone" => Ok(DeriveTrait::Clone),
836 "Copy" => Ok(DeriveTrait::Copy),
837 "Default" => Ok(DeriveTrait::Default),
838 "PartialEq" => Ok(DeriveTrait::PartialEq),
839 "Eq" => Ok(DeriveTrait::Eq),
840 "PartialOrd" => Ok(DeriveTrait::PartialOrd),
841 "Ord" => Ok(DeriveTrait::Ord),
842 "Hash" => Ok(DeriveTrait::Hash),
843 "Component" => Ok(DeriveTrait::Component),
845 "Resource" => Ok(DeriveTrait::Resource),
846 "Bundle" => Ok(DeriveTrait::Bundle),
847 "Serialize" => Ok(DeriveTrait::Serialize),
849 "Deserialize" => Ok(DeriveTrait::Deserialize),
850 _ => Ok(DeriveTrait::Custom(name.to_string())),
852 }
853 }
854
855 fn parse_enum(&mut self, visibility: Visibility) -> ParseResult<EnumDef> {
856 self.expect(Token::Enum)?;
857 let name = self.parse_ident()?;
858 let generics = self.parse_generics_opt()?;
859
860 self.expect(Token::LBrace)?;
861 let mut variants = Vec::new();
862 while !self.check(&Token::RBrace) && !self.is_eof() {
863 variants.push(self.parse_enum_variant()?);
864 if !self.consume_if(&Token::Comma) {
865 break;
866 }
867 }
868 self.expect(Token::RBrace)?;
869
870 Ok(EnumDef {
871 visibility,
872 name,
873 generics,
874 variants,
875 })
876 }
877
878 fn parse_enum_variant(&mut self) -> ParseResult<EnumVariant> {
879 let name = self.parse_ident()?;
880
881 let fields = if self.check(&Token::LBrace) {
882 self.expect(Token::LBrace)?;
883 let fields = self.parse_field_defs()?;
884 self.expect(Token::RBrace)?;
885 StructFields::Named(fields)
886 } else if self.check(&Token::LParen) {
887 self.expect(Token::LParen)?;
888 let types = self.parse_type_list()?;
889 self.expect(Token::RParen)?;
890 StructFields::Tuple(types)
891 } else {
892 StructFields::Unit
893 };
894
895 let discriminant = if self.consume_if(&Token::Eq) {
896 Some(self.parse_expr()?)
897 } else {
898 None
899 };
900
901 Ok(EnumVariant {
902 name,
903 fields,
904 discriminant,
905 })
906 }
907
908 fn parse_trait(&mut self, visibility: Visibility) -> ParseResult<TraitDef> {
909 self.expect(Token::Trait)?;
910 let name = self.parse_ident()?;
911 let generics = self.parse_generics_opt()?;
912
913 let supertraits = if self.consume_if(&Token::Colon) {
914 self.parse_type_bounds()?
915 } else {
916 vec![]
917 };
918
919 self.expect(Token::LBrace)?;
920 let mut items = Vec::new();
921 while !self.check(&Token::RBrace) && !self.is_eof() {
922 items.push(self.parse_trait_item()?);
923 }
924 self.expect(Token::RBrace)?;
925
926 Ok(TraitDef {
927 visibility,
928 name,
929 generics,
930 supertraits,
931 items,
932 })
933 }
934
935 fn parse_trait_item(&mut self) -> ParseResult<TraitItem> {
936 let visibility = self.parse_visibility()?;
937
938 match self.current_token() {
939 Some(Token::Fn) | Some(Token::Async) => {
940 Ok(TraitItem::Function(self.parse_function(visibility)?))
941 }
942 Some(Token::Type) => {
943 self.advance();
944 let name = self.parse_ident()?;
945 let bounds = if self.consume_if(&Token::Colon) {
946 self.parse_type_bounds()?
947 } else {
948 vec![]
949 };
950 self.expect(Token::Semi)?;
951 Ok(TraitItem::Type { name, bounds })
952 }
953 Some(Token::Const) => {
954 self.advance();
955 let name = self.parse_ident()?;
956 self.expect(Token::Colon)?;
957 let ty = self.parse_type()?;
958 self.expect(Token::Semi)?;
959 Ok(TraitItem::Const { name, ty })
960 }
961 Some(token) => Err(ParseError::UnexpectedToken {
962 expected: "trait item".to_string(),
963 found: token.clone(),
964 span: self.current_span(),
965 }),
966 None => Err(ParseError::UnexpectedEof),
967 }
968 }
969
970 fn parse_impl(&mut self) -> ParseResult<ImplBlock> {
971 self.expect(Token::Impl)?;
972 let generics = self.parse_generics_opt()?;
973
974 let first_type = self.parse_type()?;
976
977 let (trait_, self_ty) = if self.consume_if(&Token::For) {
978 let self_ty = self.parse_type()?;
979 let trait_path = match first_type {
980 TypeExpr::Path(p) => p,
981 _ => return Err(ParseError::Custom("expected trait path".to_string())),
982 };
983 (Some(trait_path), self_ty)
984 } else {
985 (None, first_type)
986 };
987
988 self.expect(Token::LBrace)?;
989 let mut items = Vec::new();
990 while !self.check(&Token::RBrace) && !self.is_eof() {
991 items.push(self.parse_impl_item()?);
992 }
993 self.expect(Token::RBrace)?;
994
995 Ok(ImplBlock {
996 generics,
997 trait_,
998 self_ty,
999 items,
1000 })
1001 }
1002
1003 fn parse_impl_item(&mut self) -> ParseResult<ImplItem> {
1004 let visibility = self.parse_visibility()?;
1005
1006 match self.current_token() {
1007 Some(Token::Fn) | Some(Token::Async) => {
1008 Ok(ImplItem::Function(self.parse_function(visibility)?))
1009 }
1010 Some(Token::Type) => {
1011 Ok(ImplItem::Type(self.parse_type_alias(visibility)?))
1012 }
1013 Some(Token::Const) => {
1014 Ok(ImplItem::Const(self.parse_const(visibility)?))
1015 }
1016 Some(token) => Err(ParseError::UnexpectedToken {
1017 expected: "impl item".to_string(),
1018 found: token.clone(),
1019 span: self.current_span(),
1020 }),
1021 None => Err(ParseError::UnexpectedEof),
1022 }
1023 }
1024
1025 fn parse_type_alias(&mut self, visibility: Visibility) -> ParseResult<TypeAlias> {
1026 self.expect(Token::Type)?;
1027 let name = self.parse_ident()?;
1028 let generics = self.parse_generics_opt()?;
1029 self.expect(Token::Eq)?;
1030 let ty = self.parse_type()?;
1031 self.expect(Token::Semi)?;
1032
1033 Ok(TypeAlias {
1034 visibility,
1035 name,
1036 generics,
1037 ty,
1038 })
1039 }
1040
1041 fn parse_module(&mut self, visibility: Visibility) -> ParseResult<Module> {
1042 self.expect(Token::Mod)?;
1043 let name = self.parse_ident()?;
1044
1045 let items = if self.check(&Token::LBrace) {
1046 self.expect(Token::LBrace)?;
1047 let mut items = Vec::new();
1048 while !self.check(&Token::RBrace) && !self.is_eof() {
1049 items.push(self.parse_item()?);
1050 }
1051 self.expect(Token::RBrace)?;
1052 Some(items)
1053 } else {
1054 self.expect(Token::Semi)?;
1055 None
1056 };
1057
1058 Ok(Module {
1059 visibility,
1060 name,
1061 items,
1062 })
1063 }
1064
1065 fn parse_use(&mut self, visibility: Visibility) -> ParseResult<UseDecl> {
1066 self.expect(Token::Use)?;
1067 let tree = self.parse_use_tree()?;
1068 self.expect(Token::Semi)?;
1069
1070 Ok(UseDecl { visibility, tree })
1071 }
1072
1073 fn parse_use_tree(&mut self) -> ParseResult<UseTree> {
1074 if self.consume_if(&Token::Star) {
1075 return Ok(UseTree::Glob);
1076 }
1077
1078 if self.check(&Token::LBrace) {
1079 self.expect(Token::LBrace)?;
1080 let mut trees = Vec::new();
1081 while !self.check(&Token::RBrace) {
1082 trees.push(self.parse_use_tree()?);
1083 if !self.consume_if(&Token::Comma) {
1084 break;
1085 }
1086 }
1087 self.expect(Token::RBrace)?;
1088 return Ok(UseTree::Group(trees));
1089 }
1090
1091 let name = self.parse_ident()?;
1092
1093 if self.consume_if(&Token::MiddleDot) || self.consume_if(&Token::ColonColon) {
1095 let suffix = self.parse_use_tree()?;
1096 return Ok(UseTree::Path {
1097 prefix: name,
1098 suffix: Box::new(suffix),
1099 });
1100 }
1101
1102 if self.consume_if(&Token::As) {
1104 let alias = self.parse_ident()?;
1105 return Ok(UseTree::Rename { name, alias });
1106 }
1107
1108 Ok(UseTree::Name(name))
1109 }
1110
1111 fn parse_const(&mut self, visibility: Visibility) -> ParseResult<ConstDef> {
1112 self.expect(Token::Const)?;
1113 let name = self.parse_ident()?;
1114 self.expect(Token::Colon)?;
1115 let ty = self.parse_type()?;
1116 self.expect(Token::Eq)?;
1117 let value = self.parse_expr()?;
1118 self.expect(Token::Semi)?;
1119
1120 Ok(ConstDef {
1121 visibility,
1122 name,
1123 ty,
1124 value,
1125 })
1126 }
1127
1128 fn parse_static(&mut self, visibility: Visibility) -> ParseResult<StaticDef> {
1129 self.expect(Token::Static)?;
1130 let mutable = self.consume_if(&Token::Mut);
1131 let name = self.parse_ident()?;
1132 self.expect(Token::Colon)?;
1133 let ty = self.parse_type()?;
1134 self.expect(Token::Eq)?;
1135 let value = self.parse_expr()?;
1136 self.expect(Token::Semi)?;
1137
1138 Ok(StaticDef {
1139 visibility,
1140 mutable,
1141 name,
1142 ty,
1143 value,
1144 })
1145 }
1146
1147 fn parse_actor(&mut self, visibility: Visibility) -> ParseResult<ActorDef> {
1148 self.expect(Token::Actor)?;
1149 let name = self.parse_ident()?;
1150 let generics = self.parse_generics_opt()?;
1151
1152 self.expect(Token::LBrace)?;
1153
1154 let mut state = Vec::new();
1155 let mut handlers = Vec::new();
1156
1157 while !self.check(&Token::RBrace) && !self.is_eof() {
1158 if self.check(&Token::On) {
1159 handlers.push(self.parse_message_handler()?);
1160 } else {
1161 let vis = self.parse_visibility()?;
1163 let field_name = self.parse_ident()?;
1164 self.expect(Token::Colon)?;
1165 let ty = self.parse_type()?;
1166
1167 if self.consume_if(&Token::Eq) {
1169 let _ = self.parse_expr()?;
1170 }
1171
1172 if !self.check(&Token::RBrace) && !self.check(&Token::On) {
1173 self.consume_if(&Token::Comma);
1174 }
1175
1176 state.push(FieldDef {
1177 visibility: vis,
1178 name: field_name,
1179 ty,
1180 });
1181 }
1182 }
1183
1184 self.expect(Token::RBrace)?;
1185
1186 Ok(ActorDef {
1187 visibility,
1188 name,
1189 generics,
1190 state,
1191 handlers,
1192 })
1193 }
1194
1195 fn parse_extern_block(&mut self) -> ParseResult<ExternBlock> {
1197 self.expect(Token::Extern)?;
1198
1199 let abi = if let Some(Token::StringLit(s)) = self.current_token().cloned() {
1201 self.advance();
1202 s
1203 } else {
1204 "C".to_string()
1205 };
1206
1207 self.expect(Token::LBrace)?;
1208
1209 let mut items = Vec::new();
1210
1211 while !self.check(&Token::RBrace) && !self.is_eof() {
1212 let visibility = self.parse_visibility()?;
1213
1214 match self.current_token() {
1215 Some(Token::Fn) => {
1216 items.push(ExternItem::Function(self.parse_extern_function(visibility)?));
1217 }
1218 Some(Token::Static) => {
1219 items.push(ExternItem::Static(self.parse_extern_static(visibility)?));
1220 }
1221 Some(token) => {
1222 return Err(ParseError::UnexpectedToken {
1223 expected: "fn or static".to_string(),
1224 found: token.clone(),
1225 span: self.current_span(),
1226 });
1227 }
1228 None => return Err(ParseError::UnexpectedEof),
1229 }
1230 }
1231
1232 self.expect(Token::RBrace)?;
1233
1234 Ok(ExternBlock { abi, items })
1235 }
1236
1237 fn parse_extern_function(&mut self, visibility: Visibility) -> ParseResult<ExternFunction> {
1239 self.expect(Token::Fn)?;
1240 let name = self.parse_ident()?;
1241
1242 self.expect(Token::LParen)?;
1243
1244 let mut params = Vec::new();
1245 let mut variadic = false;
1246
1247 while !self.check(&Token::RParen) && !self.is_eof() {
1248 if self.check(&Token::DotDot) {
1250 self.advance();
1251 if self.consume_if(&Token::Dot) {
1252 variadic = true;
1253 break;
1254 }
1255 }
1256
1257 let pattern = self.parse_pattern()?;
1258 self.expect(Token::Colon)?;
1259 let ty = self.parse_type()?;
1260
1261 params.push(Param { pattern, ty });
1262
1263 if !self.check(&Token::RParen) {
1264 self.expect(Token::Comma)?;
1265 }
1266 }
1267
1268 self.expect(Token::RParen)?;
1269
1270 let return_type = if self.consume_if(&Token::Arrow) {
1272 Some(self.parse_type()?)
1273 } else {
1274 None
1275 };
1276
1277 self.expect(Token::Semi)?;
1279
1280 Ok(ExternFunction {
1281 visibility,
1282 name,
1283 params,
1284 return_type,
1285 variadic,
1286 })
1287 }
1288
1289 fn parse_extern_static(&mut self, visibility: Visibility) -> ParseResult<ExternStatic> {
1291 self.expect(Token::Static)?;
1292 let mutable = self.consume_if(&Token::Mut);
1293 let name = self.parse_ident()?;
1294 self.expect(Token::Colon)?;
1295 let ty = self.parse_type()?;
1296 self.expect(Token::Semi)?;
1297
1298 Ok(ExternStatic {
1299 visibility,
1300 mutable,
1301 name,
1302 ty,
1303 })
1304 }
1305
1306 fn parse_message_handler(&mut self) -> ParseResult<MessageHandler> {
1307 self.expect(Token::On)?;
1308 let message = self.parse_ident()?;
1309
1310 self.expect(Token::LParen)?;
1311 let params = self.parse_params()?;
1312 self.expect(Token::RParen)?;
1313
1314 let return_type = if self.consume_if(&Token::Arrow) {
1315 Some(self.parse_type()?)
1316 } else {
1317 None
1318 };
1319
1320 let body = self.parse_block()?;
1321
1322 Ok(MessageHandler {
1323 message,
1324 params,
1325 return_type,
1326 body,
1327 })
1328 }
1329
1330 fn parse_type(&mut self) -> ParseResult<TypeExpr> {
1333 let base = self.parse_type_base()?;
1334
1335 if let Some(ev) = self.parse_evidentiality_opt() {
1337 return Ok(TypeExpr::Evidential {
1338 inner: Box::new(base),
1339 evidentiality: ev,
1340 });
1341 }
1342
1343 Ok(base)
1344 }
1345
1346 fn parse_type_base(&mut self) -> ParseResult<TypeExpr> {
1347 match self.current_token() {
1348 Some(Token::Amp) => {
1349 self.advance();
1350 let mutable = self.consume_if(&Token::Mut);
1351 let inner = self.parse_type()?;
1352 Ok(TypeExpr::Reference {
1353 mutable,
1354 inner: Box::new(inner),
1355 })
1356 }
1357 Some(Token::Star) => {
1358 self.advance();
1359 let mutable = if self.consume_if(&Token::Const) {
1360 false
1361 } else {
1362 self.expect(Token::Mut)?;
1363 true
1364 };
1365 let inner = self.parse_type()?;
1366 Ok(TypeExpr::Pointer {
1367 mutable,
1368 inner: Box::new(inner),
1369 })
1370 }
1371 Some(Token::LBracket) => {
1372 self.advance();
1373 let element = self.parse_type()?;
1374 if self.consume_if(&Token::Semi) {
1375 let size = self.parse_expr()?;
1376 self.expect(Token::RBracket)?;
1377 Ok(TypeExpr::Array {
1378 element: Box::new(element),
1379 size: Box::new(size),
1380 })
1381 } else {
1382 self.expect(Token::RBracket)?;
1383 Ok(TypeExpr::Slice(Box::new(element)))
1384 }
1385 }
1386 Some(Token::LParen) => {
1387 self.advance();
1388 if self.check(&Token::RParen) {
1389 self.advance();
1390 return Ok(TypeExpr::Tuple(vec![]));
1391 }
1392 let types = self.parse_type_list()?;
1393 self.expect(Token::RParen)?;
1394 Ok(TypeExpr::Tuple(types))
1395 }
1396 Some(Token::Fn) => {
1397 self.advance();
1398 self.expect(Token::LParen)?;
1399 let params = self.parse_type_list()?;
1400 self.expect(Token::RParen)?;
1401 let return_type = if self.consume_if(&Token::Arrow) {
1402 Some(Box::new(self.parse_type()?))
1403 } else {
1404 None
1405 };
1406 Ok(TypeExpr::Function {
1407 params,
1408 return_type,
1409 })
1410 }
1411 Some(Token::Bang) => {
1412 self.advance();
1413 Ok(TypeExpr::Never)
1414 }
1415 Some(Token::Underscore) => {
1416 self.advance();
1417 Ok(TypeExpr::Infer)
1418 }
1419 Some(Token::Simd) => {
1420 self.advance();
1421 self.expect(Token::Lt)?;
1422 let element = self.parse_type()?;
1423 self.expect(Token::Comma)?;
1424 let lanes = match self.current_token() {
1425 Some(Token::IntLit(s)) => {
1426 let n = s.parse::<u8>().map_err(|_| ParseError::Custom("invalid lane count".to_string()))?;
1427 self.advance();
1428 n
1429 }
1430 _ => return Err(ParseError::Custom("expected lane count".to_string())),
1431 };
1432 self.expect(Token::Gt)?;
1433 Ok(TypeExpr::Simd {
1434 element: Box::new(element),
1435 lanes,
1436 })
1437 }
1438 Some(Token::Atomic) => {
1439 self.advance();
1440 self.expect(Token::Lt)?;
1441 let inner = self.parse_type()?;
1442 self.expect(Token::Gt)?;
1443 Ok(TypeExpr::Atomic(Box::new(inner)))
1444 }
1445 _ => {
1446 let path = self.parse_type_path()?;
1447 Ok(TypeExpr::Path(path))
1448 }
1449 }
1450 }
1451
1452 fn parse_type_path(&mut self) -> ParseResult<TypePath> {
1453 let mut segments = Vec::new();
1454 segments.push(self.parse_path_segment()?);
1455
1456 while self.consume_if(&Token::ColonColon) || self.consume_if(&Token::MiddleDot) {
1457 segments.push(self.parse_path_segment()?);
1458 }
1459
1460 Ok(TypePath { segments })
1461 }
1462
1463 fn parse_path_segment(&mut self) -> ParseResult<PathSegment> {
1464 let ident = self.parse_ident()?;
1465
1466 let generics = if !self.is_in_condition() && self.consume_if(&Token::Lt) {
1468 let types = self.parse_type_list()?;
1469 self.expect(Token::Gt)?;
1470 Some(types)
1471 } else {
1472 None
1473 };
1474
1475 Ok(PathSegment { ident, generics })
1476 }
1477
1478 fn parse_type_list(&mut self) -> ParseResult<Vec<TypeExpr>> {
1479 let mut types = Vec::new();
1480 if !self.check(&Token::RParen) && !self.check(&Token::RBracket) && !self.check(&Token::Gt) {
1481 types.push(self.parse_type()?);
1482 while self.consume_if(&Token::Comma) {
1483 if self.check(&Token::RParen) || self.check(&Token::RBracket) || self.check(&Token::Gt) {
1484 break;
1485 }
1486 types.push(self.parse_type()?);
1487 }
1488 }
1489 Ok(types)
1490 }
1491
1492 fn parse_type_bounds(&mut self) -> ParseResult<Vec<TypeExpr>> {
1493 let mut bounds = Vec::new();
1494 bounds.push(self.parse_type()?);
1495 while self.consume_if(&Token::Plus) {
1496 bounds.push(self.parse_type()?);
1497 }
1498 Ok(bounds)
1499 }
1500
1501 fn parse_expr(&mut self) -> ParseResult<Expr> {
1504 let lhs = self.parse_expr_bp(0)?;
1505
1506 if self.consume_if(&Token::Eq) {
1508 let value = self.parse_expr()?;
1509 return Ok(Expr::Assign {
1510 target: Box::new(lhs),
1511 value: Box::new(value),
1512 });
1513 }
1514
1515 Ok(lhs)
1516 }
1517
1518 fn parse_expr_bp(&mut self, min_bp: u8) -> ParseResult<Expr> {
1519 let mut lhs = self.parse_prefix_expr()?;
1520
1521 loop {
1522 if self.check(&Token::Pipe) {
1524 lhs = self.parse_pipe_chain(lhs)?;
1525 continue;
1526 }
1527
1528 let op = match self.current_token() {
1530 Some(Token::OrOr) => BinOp::Or,
1531 Some(Token::AndAnd) => BinOp::And,
1532 Some(Token::EqEq) => BinOp::Eq,
1533 Some(Token::NotEq) => BinOp::Ne,
1534 Some(Token::Lt) => BinOp::Lt,
1535 Some(Token::LtEq) => BinOp::Le,
1536 Some(Token::Gt) => BinOp::Gt,
1537 Some(Token::GtEq) => BinOp::Ge,
1538 Some(Token::Plus) => BinOp::Add,
1539 Some(Token::Minus) => BinOp::Sub,
1540 Some(Token::Star) => BinOp::Mul,
1541 Some(Token::Slash) => BinOp::Div,
1542 Some(Token::Percent) => BinOp::Rem,
1543 Some(Token::StarStar) => BinOp::Pow,
1544 Some(Token::Amp) => BinOp::BitAnd,
1545 Some(Token::Caret) => BinOp::BitXor,
1546 Some(Token::Shl) => BinOp::Shl,
1547 Some(Token::Shr) => BinOp::Shr,
1548 Some(Token::PlusPlus) => BinOp::Concat,
1549 Some(Token::BitwiseAndSymbol) => BinOp::BitAnd, Some(Token::BitwiseOrSymbol) => BinOp::BitOr, _ => break,
1553 };
1554
1555 let (l_bp, r_bp) = infix_binding_power(op);
1556 if l_bp < min_bp {
1557 break;
1558 }
1559
1560 self.advance();
1561 let rhs = self.parse_expr_bp(r_bp)?;
1562
1563 lhs = Expr::Binary {
1564 left: Box::new(lhs),
1565 op,
1566 right: Box::new(rhs),
1567 };
1568 }
1569
1570 Ok(lhs)
1571 }
1572
1573 fn parse_prefix_expr(&mut self) -> ParseResult<Expr> {
1574 match self.current_token() {
1575 Some(Token::Minus) => {
1576 self.advance();
1577 let expr = self.parse_prefix_expr()?;
1578 Ok(Expr::Unary {
1579 op: UnaryOp::Neg,
1580 expr: Box::new(expr),
1581 })
1582 }
1583 Some(Token::Bang) => {
1584 self.advance();
1585 let expr = self.parse_prefix_expr()?;
1586 Ok(Expr::Unary {
1587 op: UnaryOp::Not,
1588 expr: Box::new(expr),
1589 })
1590 }
1591 Some(Token::Star) => {
1592 self.advance();
1593 let expr = self.parse_prefix_expr()?;
1594 Ok(Expr::Unary {
1595 op: UnaryOp::Deref,
1596 expr: Box::new(expr),
1597 })
1598 }
1599 Some(Token::Amp) => {
1600 self.advance();
1601 let op = if self.consume_if(&Token::Mut) {
1602 UnaryOp::RefMut
1603 } else {
1604 UnaryOp::Ref
1605 };
1606 let expr = self.parse_prefix_expr()?;
1607 Ok(Expr::Unary {
1608 op,
1609 expr: Box::new(expr),
1610 })
1611 }
1612 _ => self.parse_postfix_expr(),
1613 }
1614 }
1615
1616 fn parse_postfix_expr(&mut self) -> ParseResult<Expr> {
1617 let mut expr = self.parse_primary_expr()?;
1618
1619 loop {
1620 match self.current_token() {
1621 Some(Token::LParen) => {
1622 self.advance();
1623 let args = self.parse_expr_list()?;
1624 self.expect(Token::RParen)?;
1625 expr = Expr::Call {
1626 func: Box::new(expr),
1627 args,
1628 };
1629 }
1630 Some(Token::LBracket) => {
1631 self.advance();
1632 let index = self.parse_expr()?;
1633 self.expect(Token::RBracket)?;
1634 expr = Expr::Index {
1635 expr: Box::new(expr),
1636 index: Box::new(index),
1637 };
1638 }
1639 Some(Token::Dot) => {
1640 self.advance();
1641 let field = self.parse_ident()?;
1642 if self.check(&Token::LParen) {
1643 self.advance();
1644 let args = self.parse_expr_list()?;
1645 self.expect(Token::RParen)?;
1646 expr = Expr::MethodCall {
1647 receiver: Box::new(expr),
1648 method: field,
1649 args,
1650 };
1651 } else {
1652 expr = Expr::Field {
1653 expr: Box::new(expr),
1654 field,
1655 };
1656 }
1657 }
1658 Some(Token::Question) => {
1659 self.advance();
1660 expr = Expr::Try(Box::new(expr));
1661 }
1662 Some(Token::Bang) | Some(Token::Tilde) | Some(Token::Interrobang) => {
1663 if let Some(ev) = self.parse_evidentiality_opt() {
1664 expr = Expr::Evidential {
1665 expr: Box::new(expr),
1666 evidentiality: ev,
1667 };
1668 } else {
1669 break;
1670 }
1671 }
1672 Some(Token::Hourglass) => {
1673 self.advance();
1674 expr = Expr::Await(Box::new(expr));
1675 }
1676 _ => break,
1677 }
1678 }
1679
1680 Ok(expr)
1681 }
1682
1683 fn parse_primary_expr(&mut self) -> ParseResult<Expr> {
1684 match self.current_token().cloned() {
1685 Some(Token::IntLit(s)) => {
1686 self.advance();
1687 Ok(Expr::Literal(Literal::Int {
1688 value: s,
1689 base: NumBase::Decimal,
1690 suffix: None,
1691 }))
1692 }
1693 Some(Token::BinaryLit(s)) => {
1694 self.advance();
1695 Ok(Expr::Literal(Literal::Int {
1696 value: s,
1697 base: NumBase::Binary,
1698 suffix: None,
1699 }))
1700 }
1701 Some(Token::OctalLit(s)) => {
1702 self.advance();
1703 Ok(Expr::Literal(Literal::Int {
1704 value: s,
1705 base: NumBase::Octal,
1706 suffix: None,
1707 }))
1708 }
1709 Some(Token::HexLit(s)) => {
1710 self.advance();
1711 Ok(Expr::Literal(Literal::Int {
1712 value: s,
1713 base: NumBase::Hex,
1714 suffix: None,
1715 }))
1716 }
1717 Some(Token::VigesimalLit(s)) => {
1718 self.advance();
1719 Ok(Expr::Literal(Literal::Int {
1720 value: s,
1721 base: NumBase::Vigesimal,
1722 suffix: None,
1723 }))
1724 }
1725 Some(Token::SexagesimalLit(s)) => {
1726 self.advance();
1727 Ok(Expr::Literal(Literal::Int {
1728 value: s,
1729 base: NumBase::Sexagesimal,
1730 suffix: None,
1731 }))
1732 }
1733 Some(Token::DuodecimalLit(s)) => {
1734 self.advance();
1735 Ok(Expr::Literal(Literal::Int {
1736 value: s,
1737 base: NumBase::Duodecimal,
1738 suffix: None,
1739 }))
1740 }
1741 Some(Token::FloatLit(s)) => {
1742 self.advance();
1743 Ok(Expr::Literal(Literal::Float {
1744 value: s,
1745 suffix: None,
1746 }))
1747 }
1748 Some(Token::StringLit(s)) => {
1749 self.advance();
1750 Ok(Expr::Literal(Literal::String(s)))
1751 }
1752 Some(Token::MultiLineStringLit(s)) => {
1753 self.advance();
1754 Ok(Expr::Literal(Literal::MultiLineString(s)))
1755 }
1756 Some(Token::RawStringLit(s)) | Some(Token::RawStringDelimited(s)) => {
1757 self.advance();
1758 Ok(Expr::Literal(Literal::RawString(s)))
1759 }
1760 Some(Token::ByteStringLit(bytes)) => {
1761 self.advance();
1762 Ok(Expr::Literal(Literal::ByteString(bytes)))
1763 }
1764 Some(Token::InterpolatedStringLit(s)) => {
1765 self.advance();
1766 let parts = self.parse_interpolation_parts(&s)?;
1768 Ok(Expr::Literal(Literal::InterpolatedString { parts }))
1769 }
1770 Some(Token::SigilStringSql(s)) => {
1771 self.advance();
1772 Ok(Expr::Literal(Literal::SigilStringSql(s)))
1773 }
1774 Some(Token::SigilStringRoute(s)) => {
1775 self.advance();
1776 Ok(Expr::Literal(Literal::SigilStringRoute(s)))
1777 }
1778 Some(Token::CharLit(c)) => {
1779 self.advance();
1780 Ok(Expr::Literal(Literal::Char(c)))
1781 }
1782 Some(Token::True) => {
1783 self.advance();
1784 Ok(Expr::Literal(Literal::Bool(true)))
1785 }
1786 Some(Token::False) => {
1787 self.advance();
1788 Ok(Expr::Literal(Literal::Bool(false)))
1789 }
1790 Some(Token::Null) => {
1791 self.advance();
1792 Ok(Expr::Literal(Literal::Null))
1793 }
1794 Some(Token::Empty) => {
1795 self.advance();
1796 Ok(Expr::Literal(Literal::Empty))
1797 }
1798 Some(Token::Infinity) => {
1799 self.advance();
1800 Ok(Expr::Literal(Literal::Infinity))
1801 }
1802 Some(Token::Circle) => {
1803 self.advance();
1804 Ok(Expr::Literal(Literal::Circle))
1805 }
1806 Some(Token::LParen) => {
1807 self.advance();
1808 if self.check(&Token::RParen) {
1809 self.advance();
1810 return Ok(Expr::Tuple(vec![]));
1811 }
1812 let expr = self.parse_expr()?;
1813 if self.consume_if(&Token::Comma) {
1814 let mut exprs = vec![expr];
1815 while !self.check(&Token::RParen) {
1816 exprs.push(self.parse_expr()?);
1817 if !self.consume_if(&Token::Comma) {
1818 break;
1819 }
1820 }
1821 self.expect(Token::RParen)?;
1822 Ok(Expr::Tuple(exprs))
1823 } else {
1824 self.expect(Token::RParen)?;
1825 Ok(expr)
1826 }
1827 }
1828 Some(Token::LBracket) => {
1829 self.advance();
1830 let exprs = self.parse_expr_list()?;
1831 self.expect(Token::RBracket)?;
1832 Ok(Expr::Array(exprs))
1833 }
1834 Some(Token::LBrace) => {
1835 self.parse_block_or_closure()
1837 }
1838 Some(Token::If) => self.parse_if_expr(),
1839 Some(Token::Match) => self.parse_match_expr(),
1840 Some(Token::Loop) => {
1841 self.advance();
1842 let body = self.parse_block()?;
1843 Ok(Expr::Loop(body))
1844 }
1845 Some(Token::While) => {
1846 self.advance();
1847 let condition = self.parse_condition()?;
1848 let body = self.parse_block()?;
1849 Ok(Expr::While {
1850 condition: Box::new(condition),
1851 body,
1852 })
1853 }
1854 Some(Token::For) => {
1855 self.advance();
1856 let pattern = self.parse_pattern()?;
1857 self.expect(Token::In)?;
1858 let iter = self.parse_condition()?;
1859 let body = self.parse_block()?;
1860 Ok(Expr::For {
1861 pattern,
1862 iter: Box::new(iter),
1863 body,
1864 })
1865 }
1866 Some(Token::Return) => {
1867 self.advance();
1868 let value = if self.check(&Token::Semi) || self.check(&Token::RBrace) {
1869 None
1870 } else {
1871 Some(Box::new(self.parse_expr()?))
1872 };
1873 Ok(Expr::Return(value))
1874 }
1875 Some(Token::Break) => {
1876 self.advance();
1877 let value = if self.check(&Token::Semi) || self.check(&Token::RBrace) {
1878 None
1879 } else {
1880 Some(Box::new(self.parse_expr()?))
1881 };
1882 Ok(Expr::Break(value))
1883 }
1884 Some(Token::Continue) => {
1885 self.advance();
1886 Ok(Expr::Continue)
1887 }
1888 Some(Token::Tau) | Some(Token::Phi) | Some(Token::Sigma) |
1890 Some(Token::Rho) | Some(Token::Lambda) | Some(Token::Pi) => {
1891 let kind = self.parse_morpheme_kind()?;
1892 if self.check(&Token::LBrace) {
1893 self.advance();
1894 let body = self.parse_expr()?;
1895 self.expect(Token::RBrace)?;
1896 Ok(Expr::Morpheme {
1897 kind,
1898 body: Box::new(body),
1899 })
1900 } else {
1901 Ok(Expr::Morpheme {
1903 kind,
1904 body: Box::new(Expr::Path(TypePath {
1905 segments: vec![PathSegment {
1906 ident: Ident {
1907 name: "_".to_string(),
1908 evidentiality: None,
1909 affect: None,
1910 span: Span::default(),
1911 },
1912 generics: None,
1913 }],
1914 })),
1915 })
1916 }
1917 }
1918 Some(Token::Underscore) => {
1919 let span = self.current_span();
1921 self.advance();
1922 Ok(Expr::Path(TypePath {
1923 segments: vec![PathSegment {
1924 ident: Ident {
1925 name: "_".to_string(),
1926 evidentiality: None,
1927 affect: None,
1928 span,
1929 },
1930 generics: None,
1931 }],
1932 }))
1933 }
1934 Some(Token::SelfLower) => {
1935 let span = self.current_span();
1937 self.advance();
1938 Ok(Expr::Path(TypePath {
1939 segments: vec![PathSegment {
1940 ident: Ident {
1941 name: "self".to_string(),
1942 evidentiality: None,
1943 affect: None,
1944 span,
1945 },
1946 generics: None,
1947 }],
1948 }))
1949 }
1950 Some(Token::Ident(_)) => {
1951 let path = self.parse_type_path()?;
1952
1953 if self.check(&Token::LBrace) && !self.is_in_condition() {
1955 self.advance();
1956 let (fields, rest) = self.parse_struct_fields()?;
1957 self.expect(Token::RBrace)?;
1958 Ok(Expr::Struct { path, fields, rest })
1959 } else {
1960 Ok(Expr::Path(path))
1961 }
1962 }
1963 Some(Token::Asm) => self.parse_inline_asm(),
1964 Some(Token::Volatile) => self.parse_volatile_expr(),
1965 Some(Token::Simd) => self.parse_simd_expr(),
1966 Some(Token::Atomic) => self.parse_atomic_expr(),
1967 Some(token) => Err(ParseError::UnexpectedToken {
1968 expected: "expression".to_string(),
1969 found: token,
1970 span: self.current_span(),
1971 }),
1972 None => Err(ParseError::UnexpectedEof),
1973 }
1974 }
1975
1976 fn parse_inline_asm(&mut self) -> ParseResult<Expr> {
1987 self.expect(Token::Asm)?;
1988 self.expect(Token::Bang)?;
1989 self.expect(Token::LParen)?;
1990
1991 let template = match self.current_token().cloned() {
1993 Some(Token::StringLit(s)) => {
1994 self.advance();
1995 s
1996 }
1997 Some(t) => {
1998 return Err(ParseError::UnexpectedToken {
1999 expected: "assembly template string".to_string(),
2000 found: t,
2001 span: self.current_span(),
2002 });
2003 }
2004 None => return Err(ParseError::UnexpectedEof),
2005 };
2006
2007 let mut outputs = Vec::new();
2008 let mut inputs = Vec::new();
2009 let mut clobbers = Vec::new();
2010 let mut options = AsmOptions::default();
2011
2012 while self.consume_if(&Token::Comma) {
2014 if self.check(&Token::RParen) {
2015 break;
2016 }
2017
2018 match self.current_token().cloned() {
2019 Some(Token::Ident(ref name)) if name == "out" => {
2020 self.advance();
2021 let operand = self.parse_asm_operand(AsmOperandKind::Output)?;
2022 outputs.push(operand);
2023 }
2024 Some(Token::In) => {
2026 self.advance();
2027 let operand = self.parse_asm_operand(AsmOperandKind::Input)?;
2028 inputs.push(operand);
2029 }
2030 Some(Token::Ident(ref name)) if name == "inout" => {
2031 self.advance();
2032 let operand = self.parse_asm_operand(AsmOperandKind::InOut)?;
2033 outputs.push(operand);
2034 }
2035 Some(Token::Ident(ref name)) if name == "clobber" => {
2036 self.advance();
2037 self.expect(Token::LParen)?;
2038 while !self.check(&Token::RParen) {
2039 if let Some(Token::StringLit(reg)) = self.current_token().cloned() {
2040 self.advance();
2041 clobbers.push(reg);
2042 } else if let Some(Token::Ident(reg)) = self.current_token().cloned() {
2043 self.advance();
2044 clobbers.push(reg);
2045 }
2046 if !self.consume_if(&Token::Comma) {
2047 break;
2048 }
2049 }
2050 self.expect(Token::RParen)?;
2051 }
2052 Some(Token::Ident(ref name)) if name == "options" => {
2053 self.advance();
2054 self.expect(Token::LParen)?;
2055 while !self.check(&Token::RParen) {
2056 if let Some(Token::Ident(opt)) = self.current_token().cloned() {
2057 self.advance();
2058 match opt.as_str() {
2059 "volatile" => options.volatile = true,
2060 "nostack" => options.nostack = true,
2061 "pure" => options.pure_asm = true,
2062 "readonly" => options.readonly = true,
2063 "nomem" => options.nomem = true,
2064 "att_syntax" => options.att_syntax = true,
2065 _ => {}
2066 }
2067 }
2068 if !self.consume_if(&Token::Comma) {
2069 break;
2070 }
2071 }
2072 self.expect(Token::RParen)?;
2073 }
2074 _ => break,
2075 }
2076 }
2077
2078 self.expect(Token::RParen)?;
2079
2080 Ok(Expr::InlineAsm(InlineAsm {
2081 template,
2082 outputs,
2083 inputs,
2084 clobbers,
2085 options,
2086 }))
2087 }
2088
2089 fn parse_asm_operand(&mut self, kind: AsmOperandKind) -> ParseResult<AsmOperand> {
2091 self.expect(Token::LParen)?;
2092
2093 let constraint = match self.current_token().cloned() {
2094 Some(Token::StringLit(s)) => {
2095 self.advance();
2096 s
2097 }
2098 Some(Token::Ident(s)) => {
2099 self.advance();
2100 s
2101 }
2102 Some(t) => {
2103 return Err(ParseError::UnexpectedToken {
2104 expected: "register constraint".to_string(),
2105 found: t,
2106 span: self.current_span(),
2107 });
2108 }
2109 None => return Err(ParseError::UnexpectedEof),
2110 };
2111
2112 self.expect(Token::RParen)?;
2113
2114 let expr = self.parse_expr()?;
2115
2116 let output = if kind == AsmOperandKind::InOut && self.consume_if(&Token::FatArrow) {
2118 Some(Box::new(self.parse_expr()?))
2119 } else {
2120 None
2121 };
2122
2123 Ok(AsmOperand {
2124 constraint,
2125 expr,
2126 kind,
2127 output,
2128 })
2129 }
2130
2131 fn parse_volatile_expr(&mut self) -> ParseResult<Expr> {
2136 self.expect(Token::Volatile)?;
2137
2138 match self.current_token().cloned() {
2139 Some(Token::Ident(ref name)) if name == "read" => {
2140 self.advance();
2141
2142 let ty = if self.consume_if(&Token::Lt) {
2144 let t = self.parse_type()?;
2145 self.expect(Token::Gt)?;
2146 Some(t)
2147 } else {
2148 None
2149 };
2150
2151 self.expect(Token::LParen)?;
2152 let ptr = self.parse_expr()?;
2153 self.expect(Token::RParen)?;
2154
2155 Ok(Expr::VolatileRead {
2156 ptr: Box::new(ptr),
2157 ty,
2158 })
2159 }
2160 Some(Token::Ident(ref name)) if name == "write" => {
2161 self.advance();
2162
2163 let ty = if self.consume_if(&Token::Lt) {
2165 let t = self.parse_type()?;
2166 self.expect(Token::Gt)?;
2167 Some(t)
2168 } else {
2169 None
2170 };
2171
2172 self.expect(Token::LParen)?;
2173 let ptr = self.parse_expr()?;
2174 self.expect(Token::Comma)?;
2175 let value = self.parse_expr()?;
2176 self.expect(Token::RParen)?;
2177
2178 Ok(Expr::VolatileWrite {
2179 ptr: Box::new(ptr),
2180 value: Box::new(value),
2181 ty,
2182 })
2183 }
2184 Some(t) => Err(ParseError::UnexpectedToken {
2185 expected: "'read' or 'write' after 'volatile'".to_string(),
2186 found: t,
2187 span: self.current_span(),
2188 }),
2189 None => Err(ParseError::UnexpectedEof),
2190 }
2191 }
2192
2193 fn parse_simd_expr(&mut self) -> ParseResult<Expr> {
2205 self.expect(Token::Simd)?;
2206
2207 match self.current_token().cloned() {
2208 Some(Token::LBracket) => {
2209 self.advance();
2211 let elements = self.parse_expr_list()?;
2212 self.expect(Token::RBracket)?;
2213
2214 let ty = if self.consume_if(&Token::Colon) {
2216 Some(self.parse_type()?)
2217 } else {
2218 None
2219 };
2220
2221 Ok(Expr::SimdLiteral { elements, ty })
2222 }
2223 Some(Token::Dot) => {
2224 self.advance();
2225 match self.current_token().cloned() {
2226 Some(Token::Ident(ref op)) => {
2227 let op_name = op.clone();
2228 self.advance();
2229 self.expect(Token::LParen)?;
2230
2231 match op_name.as_str() {
2232 "splat" => {
2233 let value = self.parse_expr()?;
2234 self.expect(Token::Comma)?;
2235 let lanes = match self.current_token() {
2236 Some(Token::IntLit(s)) => {
2237 let n = s.parse::<u8>().map_err(|_| ParseError::Custom("invalid lane count".to_string()))?;
2238 self.advance();
2239 n
2240 }
2241 _ => return Err(ParseError::Custom("expected lane count".to_string())),
2242 };
2243 self.expect(Token::RParen)?;
2244 Ok(Expr::SimdSplat { value: Box::new(value), lanes })
2245 }
2246 "shuffle" => {
2247 let a = self.parse_expr()?;
2248 self.expect(Token::Comma)?;
2249 let b = self.parse_expr()?;
2250 self.expect(Token::Comma)?;
2251 self.expect(Token::LBracket)?;
2252 let mut indices = Vec::new();
2253 loop {
2254 match self.current_token() {
2255 Some(Token::IntLit(s)) => {
2256 let n = s.parse::<u8>().map_err(|_| ParseError::Custom("invalid index".to_string()))?;
2257 indices.push(n);
2258 self.advance();
2259 }
2260 _ => return Err(ParseError::Custom("expected index".to_string())),
2261 }
2262 if !self.consume_if(&Token::Comma) {
2263 break;
2264 }
2265 }
2266 self.expect(Token::RBracket)?;
2267 self.expect(Token::RParen)?;
2268 Ok(Expr::SimdShuffle { a: Box::new(a), b: Box::new(b), indices })
2269 }
2270 "extract" => {
2271 let vector = self.parse_expr()?;
2272 self.expect(Token::Comma)?;
2273 let index = match self.current_token() {
2274 Some(Token::IntLit(s)) => {
2275 let n = s.parse::<u8>().map_err(|_| ParseError::Custom("invalid index".to_string()))?;
2276 self.advance();
2277 n
2278 }
2279 _ => return Err(ParseError::Custom("expected index".to_string())),
2280 };
2281 self.expect(Token::RParen)?;
2282 Ok(Expr::SimdExtract { vector: Box::new(vector), index })
2283 }
2284 "insert" => {
2285 let vector = self.parse_expr()?;
2286 self.expect(Token::Comma)?;
2287 let index = match self.current_token() {
2288 Some(Token::IntLit(s)) => {
2289 let n = s.parse::<u8>().map_err(|_| ParseError::Custom("invalid index".to_string()))?;
2290 self.advance();
2291 n
2292 }
2293 _ => return Err(ParseError::Custom("expected index".to_string())),
2294 };
2295 self.expect(Token::Comma)?;
2296 let value = self.parse_expr()?;
2297 self.expect(Token::RParen)?;
2298 Ok(Expr::SimdInsert { vector: Box::new(vector), index, value: Box::new(value) })
2299 }
2300 _ => {
2301 let op = Self::parse_simd_op(&op_name)?;
2303 let args = self.parse_expr_list()?;
2304 self.expect(Token::RParen)?;
2305 Ok(Expr::SimdIntrinsic { op, args })
2306 }
2307 }
2308 }
2309 Some(t) => Err(ParseError::UnexpectedToken {
2310 expected: "SIMD operation name".to_string(),
2311 found: t,
2312 span: self.current_span(),
2313 }),
2314 None => Err(ParseError::UnexpectedEof),
2315 }
2316 }
2317 Some(t) => Err(ParseError::UnexpectedToken {
2318 expected: "'[' or '.' after 'simd'".to_string(),
2319 found: t,
2320 span: self.current_span(),
2321 }),
2322 None => Err(ParseError::UnexpectedEof),
2323 }
2324 }
2325
2326 fn parse_simd_op(name: &str) -> ParseResult<SimdOp> {
2327 match name {
2328 "add" => Ok(SimdOp::Add),
2329 "sub" => Ok(SimdOp::Sub),
2330 "mul" => Ok(SimdOp::Mul),
2331 "div" => Ok(SimdOp::Div),
2332 "neg" => Ok(SimdOp::Neg),
2333 "abs" => Ok(SimdOp::Abs),
2334 "min" => Ok(SimdOp::Min),
2335 "max" => Ok(SimdOp::Max),
2336 "eq" => Ok(SimdOp::Eq),
2337 "ne" => Ok(SimdOp::Ne),
2338 "lt" => Ok(SimdOp::Lt),
2339 "le" => Ok(SimdOp::Le),
2340 "gt" => Ok(SimdOp::Gt),
2341 "ge" => Ok(SimdOp::Ge),
2342 "hadd" => Ok(SimdOp::HAdd),
2343 "dot" => Ok(SimdOp::Dot),
2344 "blend" => Ok(SimdOp::Blend),
2345 "load" => Ok(SimdOp::Load),
2346 "store" => Ok(SimdOp::Store),
2347 "load_aligned" => Ok(SimdOp::LoadAligned),
2348 "store_aligned" => Ok(SimdOp::StoreAligned),
2349 "cast" => Ok(SimdOp::Cast),
2350 "widen" => Ok(SimdOp::Widen),
2351 "narrow" => Ok(SimdOp::Narrow),
2352 "sqrt" => Ok(SimdOp::Sqrt),
2353 "rsqrt" => Ok(SimdOp::Rsqrt),
2354 "rcp" => Ok(SimdOp::Rcp),
2355 "floor" => Ok(SimdOp::Floor),
2356 "ceil" => Ok(SimdOp::Ceil),
2357 "round" => Ok(SimdOp::Round),
2358 "and" => Ok(SimdOp::And),
2359 "or" => Ok(SimdOp::Or),
2360 "xor" => Ok(SimdOp::Xor),
2361 "not" => Ok(SimdOp::Not),
2362 "shl" => Ok(SimdOp::Shl),
2363 "shr" => Ok(SimdOp::Shr),
2364 _ => Err(ParseError::Custom(format!("unknown SIMD operation: {}", name))),
2365 }
2366 }
2367
2368 fn parse_atomic_expr(&mut self) -> ParseResult<Expr> {
2380 self.expect(Token::Atomic)?;
2381 self.expect(Token::Dot)?;
2382
2383 match self.current_token().cloned() {
2384 Some(Token::Ident(ref op)) => {
2385 let op_name = op.clone();
2386 self.advance();
2387
2388 if op_name == "fence" {
2389 self.expect(Token::LParen)?;
2390 let ordering = self.parse_memory_ordering()?;
2391 self.expect(Token::RParen)?;
2392 return Ok(Expr::AtomicFence { ordering });
2393 }
2394
2395 self.expect(Token::LParen)?;
2396 let ptr = self.parse_expr()?;
2397
2398 let op = Self::parse_atomic_op(&op_name)?;
2399
2400 let value = match op {
2402 AtomicOp::Load => None,
2403 _ => {
2404 self.expect(Token::Comma)?;
2405 Some(Box::new(self.parse_expr()?))
2406 }
2407 };
2408
2409 let expected = match op {
2411 AtomicOp::CompareExchange | AtomicOp::CompareExchangeWeak => {
2412 self.expect(Token::Comma)?;
2413 Some(Box::new(self.parse_expr()?))
2414 }
2415 _ => None,
2416 };
2417
2418 self.expect(Token::Comma)?;
2420 let ordering = self.parse_memory_ordering()?;
2421
2422 let failure_ordering = match op {
2424 AtomicOp::CompareExchange | AtomicOp::CompareExchangeWeak => {
2425 if self.consume_if(&Token::Comma) {
2426 Some(self.parse_memory_ordering()?)
2427 } else {
2428 None
2429 }
2430 }
2431 _ => None,
2432 };
2433
2434 self.expect(Token::RParen)?;
2435
2436 Ok(Expr::AtomicOp {
2437 op,
2438 ptr: Box::new(ptr),
2439 value,
2440 expected,
2441 ordering,
2442 failure_ordering,
2443 })
2444 }
2445 Some(t) => Err(ParseError::UnexpectedToken {
2446 expected: "atomic operation name".to_string(),
2447 found: t,
2448 span: self.current_span(),
2449 }),
2450 None => Err(ParseError::UnexpectedEof),
2451 }
2452 }
2453
2454 fn parse_atomic_op(name: &str) -> ParseResult<AtomicOp> {
2455 match name {
2456 "load" => Ok(AtomicOp::Load),
2457 "store" => Ok(AtomicOp::Store),
2458 "swap" => Ok(AtomicOp::Swap),
2459 "compare_exchange" => Ok(AtomicOp::CompareExchange),
2460 "compare_exchange_weak" => Ok(AtomicOp::CompareExchangeWeak),
2461 "fetch_add" => Ok(AtomicOp::FetchAdd),
2462 "fetch_sub" => Ok(AtomicOp::FetchSub),
2463 "fetch_and" => Ok(AtomicOp::FetchAnd),
2464 "fetch_or" => Ok(AtomicOp::FetchOr),
2465 "fetch_xor" => Ok(AtomicOp::FetchXor),
2466 "fetch_min" => Ok(AtomicOp::FetchMin),
2467 "fetch_max" => Ok(AtomicOp::FetchMax),
2468 _ => Err(ParseError::Custom(format!("unknown atomic operation: {}", name))),
2469 }
2470 }
2471
2472 fn parse_memory_ordering(&mut self) -> ParseResult<MemoryOrdering> {
2473 match self.current_token() {
2474 Some(Token::Ident(name)) => {
2475 let ordering = match name.as_str() {
2476 "Relaxed" => MemoryOrdering::Relaxed,
2477 "Acquire" => MemoryOrdering::Acquire,
2478 "Release" => MemoryOrdering::Release,
2479 "AcqRel" => MemoryOrdering::AcqRel,
2480 "SeqCst" => MemoryOrdering::SeqCst,
2481 _ => return Err(ParseError::Custom("expected memory ordering (Relaxed, Acquire, Release, AcqRel, SeqCst)".to_string())),
2482 };
2483 self.advance();
2484 Ok(ordering)
2485 }
2486 _ => Err(ParseError::Custom("expected memory ordering".to_string())),
2487 }
2488 }
2489
2490 fn parse_pipe_chain(&mut self, initial: Expr) -> ParseResult<Expr> {
2492 let mut operations = Vec::new();
2493
2494 while self.consume_if(&Token::Pipe) {
2495 let op = self.parse_pipe_op()?;
2496 operations.push(op);
2497 }
2498
2499 Ok(Expr::Pipe {
2500 expr: Box::new(initial),
2501 operations,
2502 })
2503 }
2504
2505 fn parse_pipe_op(&mut self) -> ParseResult<PipeOp> {
2506 match self.current_token() {
2507 Some(Token::Tau) => {
2508 self.advance();
2509 self.expect(Token::LBrace)?;
2510 let body = self.parse_expr()?;
2511 self.expect(Token::RBrace)?;
2512 Ok(PipeOp::Transform(Box::new(body)))
2513 }
2514 Some(Token::Phi) => {
2515 self.advance();
2516 self.expect(Token::LBrace)?;
2517 let body = self.parse_expr()?;
2518 self.expect(Token::RBrace)?;
2519 Ok(PipeOp::Filter(Box::new(body)))
2520 }
2521 Some(Token::Sigma) => {
2522 self.advance();
2523 let field = if self.consume_if(&Token::Dot) {
2524 Some(self.parse_ident()?)
2525 } else {
2526 None
2527 };
2528 Ok(PipeOp::Sort(field))
2529 }
2530 Some(Token::Rho) => {
2531 self.advance();
2532 self.expect(Token::LBrace)?;
2533 let body = self.parse_expr()?;
2534 self.expect(Token::RBrace)?;
2535 Ok(PipeOp::Reduce(Box::new(body)))
2536 }
2537 Some(Token::Alpha) => {
2539 self.advance();
2540 Ok(PipeOp::First)
2541 }
2542 Some(Token::Omega) => {
2543 self.advance();
2544 Ok(PipeOp::Last)
2545 }
2546 Some(Token::Mu) => {
2547 self.advance();
2548 Ok(PipeOp::Middle)
2549 }
2550 Some(Token::Chi) => {
2551 self.advance();
2552 Ok(PipeOp::Choice)
2553 }
2554 Some(Token::Nu) => {
2555 self.advance();
2556 if self.check(&Token::LBrace) {
2558 self.advance();
2559 let index = self.parse_expr()?;
2560 self.expect(Token::RBrace)?;
2561 Ok(PipeOp::Nth(Box::new(index)))
2562 } else {
2563 Ok(PipeOp::Nth(Box::new(Expr::Literal(Literal::Int {
2565 value: "0".to_string(),
2566 base: NumBase::Decimal,
2567 suffix: None,
2568 }))))
2569 }
2570 }
2571 Some(Token::Xi) => {
2572 self.advance();
2573 Ok(PipeOp::Next)
2574 }
2575 Some(Token::Parallel) => {
2577 self.advance();
2578 let inner_op = self.parse_pipe_op()?;
2580 Ok(PipeOp::Parallel(Box::new(inner_op)))
2581 }
2582 Some(Token::Gpu) => {
2584 self.advance();
2585 let inner_op = self.parse_pipe_op()?;
2587 Ok(PipeOp::Gpu(Box::new(inner_op)))
2588 }
2589 Some(Token::Await) => {
2590 self.advance();
2591 Ok(PipeOp::Await)
2592 }
2593 Some(Token::Hourglass) => {
2594 self.advance();
2595 Ok(PipeOp::Await)
2596 }
2597 Some(Token::MiddleDot) => {
2598 self.advance();
2599 let mut prefix = Vec::new();
2600 prefix.push(self.parse_ident()?);
2601
2602 while self.consume_if(&Token::MiddleDot) {
2603 if self.check(&Token::LBrace) {
2604 break;
2605 }
2606 prefix.push(self.parse_ident()?);
2607 }
2608
2609 let body = if self.check(&Token::LBrace) {
2610 self.advance();
2611 let expr = self.parse_expr()?;
2612 self.expect(Token::RBrace)?;
2613 Some(Box::new(expr))
2614 } else {
2615 None
2616 };
2617
2618 Ok(PipeOp::Named { prefix, body })
2619 }
2620 Some(Token::Ident(_)) => {
2621 let name = self.parse_ident()?;
2622 let args = if self.check(&Token::LParen) {
2623 self.advance();
2624 let args = self.parse_expr_list()?;
2625 self.expect(Token::RParen)?;
2626 args
2627 } else {
2628 vec![]
2629 };
2630 Ok(PipeOp::Method { name, args })
2631 }
2632
2633 Some(Token::Send) | Some(Token::ProtoSend) => {
2639 self.advance();
2640 self.expect(Token::LBrace)?;
2641 let data = self.parse_expr()?;
2642 self.expect(Token::RBrace)?;
2643 Ok(PipeOp::Send(Box::new(data)))
2644 }
2645
2646 Some(Token::Recv) | Some(Token::ProtoRecv) => {
2648 self.advance();
2649 Ok(PipeOp::Recv)
2650 }
2651
2652 Some(Token::Stream) | Some(Token::ProtoStream) => {
2654 self.advance();
2655 self.expect(Token::LBrace)?;
2656 let handler = self.parse_expr()?;
2657 self.expect(Token::RBrace)?;
2658 Ok(PipeOp::Stream(Box::new(handler)))
2659 }
2660
2661 Some(Token::Connect) | Some(Token::ProtoConnect) => {
2663 self.advance();
2664 let config = if self.check(&Token::LBrace) {
2665 self.advance();
2666 let expr = self.parse_expr()?;
2667 self.expect(Token::RBrace)?;
2668 Some(Box::new(expr))
2669 } else {
2670 None
2671 };
2672 Ok(PipeOp::Connect(config))
2673 }
2674
2675 Some(Token::Close) | Some(Token::Tensor) => {
2677 self.advance();
2678 Ok(PipeOp::Close)
2679 }
2680
2681 Some(Token::Timeout) | Some(Token::ProtoTimeout) => {
2683 self.advance();
2684 self.expect(Token::LBrace)?;
2685 let ms = self.parse_expr()?;
2686 self.expect(Token::RBrace)?;
2687 Ok(PipeOp::Timeout(Box::new(ms)))
2688 }
2689
2690 Some(Token::Retry) => {
2692 self.advance();
2693 self.expect(Token::LBrace)?;
2694 let count = self.parse_expr()?;
2695 let strategy = if self.consume_if(&Token::Comma) {
2696 Some(Box::new(self.parse_expr()?))
2697 } else {
2698 None
2699 };
2700 self.expect(Token::RBrace)?;
2701 Ok(PipeOp::Retry { count: Box::new(count), strategy })
2702 }
2703
2704 Some(Token::Header) => {
2706 self.advance();
2707 self.expect(Token::LBrace)?;
2708 let name = self.parse_expr()?;
2709 self.expect(Token::Comma)?;
2710 let value = self.parse_expr()?;
2711 self.expect(Token::RBrace)?;
2712 Ok(PipeOp::Header { name: Box::new(name), value: Box::new(value) })
2713 }
2714
2715 Some(Token::Body) => {
2717 self.advance();
2718 self.expect(Token::LBrace)?;
2719 let data = self.parse_expr()?;
2720 self.expect(Token::RBrace)?;
2721 Ok(PipeOp::Body(Box::new(data)))
2722 }
2723
2724 Some(token) => Err(ParseError::UnexpectedToken {
2725 expected: "pipe operation".to_string(),
2726 found: token.clone(),
2727 span: self.current_span(),
2728 }),
2729 None => Err(ParseError::UnexpectedEof),
2730 }
2731 }
2732
2733 fn parse_morpheme_kind(&mut self) -> ParseResult<MorphemeKind> {
2734 match self.current_token() {
2735 Some(Token::Tau) => {
2736 self.advance();
2737 Ok(MorphemeKind::Transform)
2738 }
2739 Some(Token::Phi) => {
2740 self.advance();
2741 Ok(MorphemeKind::Filter)
2742 }
2743 Some(Token::Sigma) => {
2744 self.advance();
2745 Ok(MorphemeKind::Sort)
2746 }
2747 Some(Token::Rho) => {
2748 self.advance();
2749 Ok(MorphemeKind::Reduce)
2750 }
2751 Some(Token::Lambda) => {
2752 self.advance();
2753 Ok(MorphemeKind::Lambda)
2754 }
2755 Some(Token::Pi) => {
2756 self.advance();
2757 Ok(MorphemeKind::Product)
2758 }
2759 _ => Err(ParseError::Custom("expected morpheme".to_string())),
2760 }
2761 }
2762
2763 fn parse_block_or_closure(&mut self) -> ParseResult<Expr> {
2764 self.expect(Token::LBrace)?;
2765 self.skip_comments();
2766
2767 let is_simple_closure = matches!(self.current_token(), Some(Token::Ident(_)))
2770 && matches!(self.peek_next(), Some(Token::FatArrow));
2771
2772 if is_simple_closure {
2773 let name = self.parse_ident()?;
2774 self.expect(Token::FatArrow)?;
2775 self.skip_comments();
2776 let body = self.parse_expr()?;
2777 self.skip_comments();
2778 self.expect(Token::RBrace)?;
2779 return Ok(Expr::Closure {
2780 params: vec![ClosureParam {
2781 pattern: Pattern::Ident {
2782 mutable: false,
2783 name,
2784 evidentiality: None,
2785 },
2786 ty: None,
2787 }],
2788 body: Box::new(body),
2789 });
2790 }
2791
2792 let mut stmts = Vec::new();
2794 let mut final_expr = None;
2795
2796 while !self.check(&Token::RBrace) && !self.is_eof() {
2797 self.skip_comments();
2798 if self.check(&Token::RBrace) {
2799 break;
2800 }
2801
2802 if self.is_item_start() {
2803 let item = self.parse_item()?;
2804 stmts.push(Stmt::Item(Box::new(item.node)));
2805 } else if self.check(&Token::Let) {
2806 stmts.push(self.parse_let_stmt()?);
2807 } else {
2808 let expr = self.parse_expr()?;
2809 self.skip_comments();
2810 if self.consume_if(&Token::Semi) {
2811 stmts.push(Stmt::Semi(expr));
2812 } else if self.check(&Token::RBrace) {
2813 final_expr = Some(Box::new(expr));
2814 } else {
2815 stmts.push(Stmt::Expr(expr));
2816 }
2817 }
2818 }
2819
2820 self.expect(Token::RBrace)?;
2821
2822 Ok(Expr::Block(Block {
2823 stmts,
2824 expr: final_expr,
2825 }))
2826 }
2827
2828 fn parse_block(&mut self) -> ParseResult<Block> {
2829 match self.parse_block_or_closure()? {
2830 Expr::Block(block) => Ok(block),
2831 _ => Err(ParseError::Custom("expected block".to_string())),
2832 }
2833 }
2834
2835 fn parse_let_stmt(&mut self) -> ParseResult<Stmt> {
2836 self.expect(Token::Let)?;
2837 let pattern = self.parse_pattern()?;
2838 let ty = if self.consume_if(&Token::Colon) {
2839 Some(self.parse_type()?)
2840 } else {
2841 None
2842 };
2843 let init = if self.consume_if(&Token::Eq) {
2844 Some(self.parse_expr()?)
2845 } else {
2846 None
2847 };
2848 self.expect(Token::Semi)?;
2849
2850 Ok(Stmt::Let { pattern, ty, init })
2851 }
2852
2853 fn parse_if_expr(&mut self) -> ParseResult<Expr> {
2854 self.expect(Token::If)?;
2855 let condition = self.parse_condition()?;
2856 let then_branch = self.parse_block()?;
2857 let else_branch = if self.consume_if(&Token::Else) {
2858 if self.check(&Token::If) {
2859 Some(Box::new(self.parse_if_expr()?))
2860 } else {
2861 Some(Box::new(Expr::Block(self.parse_block()?)))
2862 }
2863 } else {
2864 None
2865 };
2866
2867 Ok(Expr::If {
2868 condition: Box::new(condition),
2869 then_branch,
2870 else_branch,
2871 })
2872 }
2873
2874 fn parse_match_expr(&mut self) -> ParseResult<Expr> {
2875 self.expect(Token::Match)?;
2876 let expr = self.parse_expr()?;
2877 self.expect(Token::LBrace)?;
2878
2879 let mut arms = Vec::new();
2880 while !self.check(&Token::RBrace) && !self.is_eof() {
2881 let pattern = self.parse_pattern()?;
2882 let guard = if self.consume_if(&Token::If) {
2883 Some(self.parse_condition()?)
2884 } else {
2885 None
2886 };
2887 self.expect(Token::FatArrow)?;
2888 let body = self.parse_expr()?;
2889 arms.push(MatchArm {
2890 pattern,
2891 guard,
2892 body,
2893 });
2894 if !self.consume_if(&Token::Comma) {
2895 break;
2896 }
2897 }
2898
2899 self.expect(Token::RBrace)?;
2900
2901 Ok(Expr::Match {
2902 expr: Box::new(expr),
2903 arms,
2904 })
2905 }
2906
2907 fn parse_pattern(&mut self) -> ParseResult<Pattern> {
2910 match self.current_token().cloned() {
2911 Some(Token::Underscore) => {
2912 self.advance();
2913 Ok(Pattern::Wildcard)
2914 }
2915 Some(Token::DotDot) => {
2916 self.advance();
2917 Ok(Pattern::Rest)
2918 }
2919 Some(Token::Mut) => {
2920 self.advance();
2921 let name = self.parse_ident()?;
2922 let evidentiality = self.parse_evidentiality_opt();
2923 Ok(Pattern::Ident {
2924 mutable: true,
2925 name,
2926 evidentiality,
2927 })
2928 }
2929 Some(Token::LParen) => {
2930 self.advance();
2931 let mut patterns = Vec::new();
2932 while !self.check(&Token::RParen) {
2933 patterns.push(self.parse_pattern()?);
2934 if !self.consume_if(&Token::Comma) {
2935 break;
2936 }
2937 }
2938 self.expect(Token::RParen)?;
2939 Ok(Pattern::Tuple(patterns))
2940 }
2941 Some(Token::LBracket) => {
2942 self.advance();
2943 let mut patterns = Vec::new();
2944 while !self.check(&Token::RBracket) {
2945 patterns.push(self.parse_pattern()?);
2946 if !self.consume_if(&Token::Comma) {
2947 break;
2948 }
2949 }
2950 self.expect(Token::RBracket)?;
2951 Ok(Pattern::Slice(patterns))
2952 }
2953 Some(Token::IntLit(_)) | Some(Token::StringLit(_)) |
2954 Some(Token::CharLit(_)) | Some(Token::True) | Some(Token::False) |
2955 Some(Token::Null) => {
2956 let lit = self.parse_literal()?;
2957 Ok(Pattern::Literal(lit))
2958 }
2959 Some(Token::Ident(_)) => {
2960 let name = self.parse_ident()?;
2961 let evidentiality = self.parse_evidentiality_opt();
2962 Ok(Pattern::Ident {
2963 mutable: false,
2964 name,
2965 evidentiality,
2966 })
2967 }
2968 Some(token) => Err(ParseError::UnexpectedToken {
2969 expected: "pattern".to_string(),
2970 found: token,
2971 span: self.current_span(),
2972 }),
2973 None => Err(ParseError::UnexpectedEof),
2974 }
2975 }
2976
2977 fn parse_literal(&mut self) -> ParseResult<Literal> {
2978 match self.current_token().cloned() {
2979 Some(Token::IntLit(s)) => {
2980 self.advance();
2981 Ok(Literal::Int {
2982 value: s,
2983 base: NumBase::Decimal,
2984 suffix: None,
2985 })
2986 }
2987 Some(Token::FloatLit(s)) => {
2988 self.advance();
2989 Ok(Literal::Float {
2990 value: s,
2991 suffix: None,
2992 })
2993 }
2994 Some(Token::StringLit(s)) => {
2995 self.advance();
2996 Ok(Literal::String(s))
2997 }
2998 Some(Token::CharLit(c)) => {
2999 self.advance();
3000 Ok(Literal::Char(c))
3001 }
3002 Some(Token::True) => {
3003 self.advance();
3004 Ok(Literal::Bool(true))
3005 }
3006 Some(Token::False) => {
3007 self.advance();
3008 Ok(Literal::Bool(false))
3009 }
3010 Some(Token::Null) => {
3011 self.advance();
3012 Ok(Literal::Null)
3013 }
3014 _ => Err(ParseError::Custom("expected literal".to_string())),
3015 }
3016 }
3017
3018 fn parse_ident(&mut self) -> ParseResult<Ident> {
3021 match self.current.take() {
3022 Some((Token::Ident(name), span)) => {
3023 self.current = self.lexer.next_token();
3024 let affect = self.parse_affect_opt();
3026 Ok(Ident {
3027 name,
3028 evidentiality: None,
3029 affect,
3030 span,
3031 })
3032 }
3033 Some((token, span)) => {
3034 self.current = Some((token.clone(), span));
3035 Err(ParseError::UnexpectedToken {
3036 expected: "identifier".to_string(),
3037 found: token,
3038 span,
3039 })
3040 }
3041 None => Err(ParseError::UnexpectedEof),
3042 }
3043 }
3044
3045 fn parse_evidentiality_opt(&mut self) -> Option<Evidentiality> {
3046 match self.current_token() {
3047 Some(Token::Bang) => {
3048 self.advance();
3049 Some(Evidentiality::Known)
3050 }
3051 Some(Token::Question) => {
3052 self.advance();
3053 Some(Evidentiality::Uncertain)
3054 }
3055 Some(Token::Tilde) => {
3056 self.advance();
3057 Some(Evidentiality::Reported)
3058 }
3059 Some(Token::Interrobang) => {
3060 self.advance();
3061 Some(Evidentiality::Paradox)
3062 }
3063 _ => None,
3064 }
3065 }
3066
3067 fn parse_affect_opt(&mut self) -> Option<Affect> {
3071 let mut sentiment = None;
3072 let mut sarcasm = false;
3073 let mut intensity = None;
3074 let mut formality = None;
3075 let mut emotion = None;
3076 let mut confidence = None;
3077 let mut found_any = false;
3078
3079 loop {
3081 match self.current_token() {
3082 Some(Token::DirectSum) => {
3084 self.advance();
3085 sentiment = Some(Sentiment::Positive);
3086 found_any = true;
3087 }
3088 Some(Token::AffectNegative) => {
3089 self.advance();
3090 sentiment = Some(Sentiment::Negative);
3091 found_any = true;
3092 }
3093 Some(Token::AffectNeutral) => {
3094 self.advance();
3095 sentiment = Some(Sentiment::Neutral);
3096 found_any = true;
3097 }
3098 Some(Token::IronyMark) => {
3100 self.advance();
3101 sarcasm = true;
3102 found_any = true;
3103 }
3104 Some(Token::IntensityUp) => {
3106 self.advance();
3107 intensity = Some(Intensity::Up);
3108 found_any = true;
3109 }
3110 Some(Token::IntensityDown) => {
3111 self.advance();
3112 intensity = Some(Intensity::Down);
3113 found_any = true;
3114 }
3115 Some(Token::IntensityMax) => {
3116 self.advance();
3117 intensity = Some(Intensity::Max);
3118 found_any = true;
3119 }
3120 Some(Token::FormalRegister) => {
3122 self.advance();
3123 formality = Some(Formality::Formal);
3124 found_any = true;
3125 }
3126 Some(Token::InformalRegister) => {
3127 self.advance();
3128 formality = Some(Formality::Informal);
3129 found_any = true;
3130 }
3131 Some(Token::EmotionJoy) => {
3133 self.advance();
3134 emotion = Some(Emotion::Joy);
3135 found_any = true;
3136 }
3137 Some(Token::EmotionSadness) => {
3138 self.advance();
3139 emotion = Some(Emotion::Sadness);
3140 found_any = true;
3141 }
3142 Some(Token::EmotionAnger) => {
3143 self.advance();
3144 emotion = Some(Emotion::Anger);
3145 found_any = true;
3146 }
3147 Some(Token::EmotionFear) => {
3148 self.advance();
3149 emotion = Some(Emotion::Fear);
3150 found_any = true;
3151 }
3152 Some(Token::EmotionSurprise) => {
3153 self.advance();
3154 emotion = Some(Emotion::Surprise);
3155 found_any = true;
3156 }
3157 Some(Token::EmotionLove) => {
3158 self.advance();
3159 emotion = Some(Emotion::Love);
3160 found_any = true;
3161 }
3162 Some(Token::ConfidenceHigh) => {
3164 self.advance();
3165 confidence = Some(Confidence::High);
3166 found_any = true;
3167 }
3168 Some(Token::ConfidenceMedium) => {
3169 self.advance();
3170 confidence = Some(Confidence::Medium);
3171 found_any = true;
3172 }
3173 Some(Token::ConfidenceLow) => {
3174 self.advance();
3175 confidence = Some(Confidence::Low);
3176 found_any = true;
3177 }
3178 _ => break,
3179 }
3180 }
3181
3182 if found_any {
3183 Some(Affect {
3184 sentiment,
3185 sarcasm,
3186 intensity,
3187 formality,
3188 emotion,
3189 confidence,
3190 })
3191 } else {
3192 None
3193 }
3194 }
3195
3196 fn parse_generics_opt(&mut self) -> ParseResult<Option<Generics>> {
3197 if !self.consume_if(&Token::Lt) {
3198 return Ok(None);
3199 }
3200
3201 let mut params = Vec::new();
3202 while !self.check(&Token::Gt) && !self.is_eof() {
3203 let name = self.parse_ident()?;
3205 let evidentiality = self.parse_evidentiality_opt();
3206 let bounds = if self.consume_if(&Token::Colon) {
3207 self.parse_type_bounds()?
3208 } else {
3209 vec![]
3210 };
3211 params.push(GenericParam::Type {
3212 name,
3213 bounds,
3214 evidentiality,
3215 });
3216 if !self.consume_if(&Token::Comma) {
3217 break;
3218 }
3219 }
3220 self.expect(Token::Gt)?;
3221
3222 Ok(Some(Generics { params }))
3223 }
3224
3225 fn parse_where_clause_opt(&mut self) -> ParseResult<Option<WhereClause>> {
3226 if !self.consume_if(&Token::Where) {
3227 return Ok(None);
3228 }
3229
3230 let mut predicates = Vec::new();
3231 loop {
3232 let ty = self.parse_type()?;
3233 self.expect(Token::Colon)?;
3234 let bounds = self.parse_type_bounds()?;
3235 predicates.push(WherePredicate { ty, bounds });
3236 if !self.consume_if(&Token::Comma) {
3237 break;
3238 }
3239 if self.check(&Token::LBrace) {
3241 break;
3242 }
3243 }
3244
3245 Ok(Some(WhereClause { predicates }))
3246 }
3247
3248 fn parse_params(&mut self) -> ParseResult<Vec<Param>> {
3249 let mut params = Vec::new();
3250 while !self.check(&Token::RParen) && !self.is_eof() {
3251 let pattern = self.parse_pattern()?;
3252 let ty = if self.consume_if(&Token::Colon) {
3254 self.parse_type()?
3255 } else {
3256 TypeExpr::Infer
3257 };
3258 params.push(Param { pattern, ty });
3259 if !self.consume_if(&Token::Comma) {
3260 break;
3261 }
3262 }
3263 Ok(params)
3264 }
3265
3266 fn parse_field_defs(&mut self) -> ParseResult<Vec<FieldDef>> {
3267 let mut fields = Vec::new();
3268 while !self.check(&Token::RBrace) && !self.is_eof() {
3269 let visibility = self.parse_visibility()?;
3270 let name = self.parse_ident()?;
3271 self.expect(Token::Colon)?;
3272 let ty = self.parse_type()?;
3273 fields.push(FieldDef {
3274 visibility,
3275 name,
3276 ty,
3277 });
3278 if !self.consume_if(&Token::Comma) {
3279 break;
3280 }
3281 }
3282 Ok(fields)
3283 }
3284
3285 fn parse_expr_list(&mut self) -> ParseResult<Vec<Expr>> {
3286 let mut exprs = Vec::new();
3287 while !self.check(&Token::RParen) && !self.check(&Token::RBracket) && !self.is_eof() {
3288 exprs.push(self.parse_expr()?);
3289 if !self.consume_if(&Token::Comma) {
3290 break;
3291 }
3292 }
3293 Ok(exprs)
3294 }
3295
3296 fn parse_struct_fields(&mut self) -> ParseResult<(Vec<FieldInit>, Option<Box<Expr>>)> {
3297 let mut fields = Vec::new();
3298 let mut rest = None;
3299
3300 while !self.check(&Token::RBrace) && !self.is_eof() {
3301 if self.consume_if(&Token::DotDot) {
3302 rest = Some(Box::new(self.parse_expr()?));
3303 break;
3304 }
3305
3306 let name = self.parse_ident()?;
3307 let value = if self.consume_if(&Token::Colon) {
3308 Some(self.parse_expr()?)
3309 } else {
3310 None
3311 };
3312 fields.push(FieldInit { name, value });
3313
3314 if !self.consume_if(&Token::Comma) {
3315 break;
3316 }
3317 }
3318
3319 Ok((fields, rest))
3320 }
3321
3322 fn is_item_start(&self) -> bool {
3323 matches!(
3324 self.current_token(),
3325 Some(Token::Fn) | Some(Token::Async) | Some(Token::Struct) |
3326 Some(Token::Enum) | Some(Token::Trait) | Some(Token::Impl) |
3327 Some(Token::Type) | Some(Token::Mod) | Some(Token::Use) |
3328 Some(Token::Const) | Some(Token::Static) | Some(Token::Actor) |
3329 Some(Token::Pub)
3330 )
3331 }
3332
3333 fn is_in_condition(&self) -> bool {
3334 self.in_condition
3335 }
3336
3337 fn parse_condition(&mut self) -> ParseResult<Expr> {
3339 let was_in_condition = self.in_condition;
3340 self.in_condition = true;
3341 let result = self.parse_expr();
3342 self.in_condition = was_in_condition;
3343 result
3344 }
3345}
3346
3347fn infix_binding_power(op: BinOp) -> (u8, u8) {
3349 match op {
3350 BinOp::Or => (1, 2),
3351 BinOp::And => (3, 4),
3352 BinOp::Eq | BinOp::Ne | BinOp::Lt | BinOp::Le | BinOp::Gt | BinOp::Ge => (5, 6),
3353 BinOp::BitOr => (7, 8),
3354 BinOp::BitXor => (9, 10),
3355 BinOp::BitAnd => (11, 12),
3356 BinOp::Shl | BinOp::Shr => (13, 14),
3357 BinOp::Add | BinOp::Sub | BinOp::Concat => (15, 16),
3358 BinOp::Mul | BinOp::Div | BinOp::Rem => (17, 18),
3359 BinOp::Pow => (20, 19), }
3361}
3362
3363#[cfg(test)]
3364mod tests {
3365 use super::*;
3366
3367 #[test]
3368 fn test_parse_function() {
3369 let source = "fn hello(name: str) -> str { return name; }";
3371 let mut parser = Parser::new(source);
3372 let file = parser.parse_file().unwrap();
3373 assert_eq!(file.items.len(), 1);
3374 }
3375
3376 #[test]
3377 fn test_parse_pipe_chain() {
3378 let source = "fn main() { let result = data|τ{_ * 2}|φ{_ > 0}|σ; }";
3379 let mut parser = Parser::new(source);
3380 let file = parser.parse_file().unwrap();
3381 assert_eq!(file.items.len(), 1);
3382 }
3383
3384 #[test]
3385 fn test_parse_async_function() {
3386 let source = "async fn fetch(url: str) -> Response~ { return http·get(url)|await; }";
3387 let mut parser = Parser::new(source);
3388 let file = parser.parse_file().unwrap();
3389 assert_eq!(file.items.len(), 1);
3390 }
3391
3392 #[test]
3393 fn test_parse_struct() {
3394 let source = "struct Point { x: f64, y: f64 }";
3395 let mut parser = Parser::new(source);
3396 let file = parser.parse_file().unwrap();
3397 assert_eq!(file.items.len(), 1);
3398 }
3399
3400 #[test]
3401 fn test_parse_actor() {
3402 let source = r#"
3404 actor Counter {
3405 state: i64 = 0
3406 on Increment(n: i64) { return self.state + n; }
3407 }
3408 "#;
3409 let mut parser = Parser::new(source);
3410 let file = parser.parse_file().unwrap();
3411 assert_eq!(file.items.len(), 1);
3412 }
3413
3414 #[test]
3415 fn test_parse_number_bases() {
3416 let source = "fn bases() { let a = 42; let b = 0b101010; let c = 0x2A; let d = 0v22; }";
3417 let mut parser = Parser::new(source);
3418 let file = parser.parse_file().unwrap();
3419 assert_eq!(file.items.len(), 1);
3420 }
3421
3422 #[test]
3423 fn test_parse_inline_asm() {
3424 let source = r#"
3425 fn outb(port: u16, value: u8) {
3426 asm!("out dx, al",
3427 in("dx") port,
3428 in("al") value,
3429 options(nostack));
3430 }
3431 "#;
3432 let mut parser = Parser::new(source);
3433 let file = parser.parse_file().unwrap();
3434 assert_eq!(file.items.len(), 1);
3435
3436 if let Item::Function(func) = &file.items[0].node {
3437 assert_eq!(func.name.name, "outb");
3438 } else {
3439 panic!("Expected function");
3440 }
3441 }
3442
3443 #[test]
3444 fn test_parse_inline_asm_with_outputs() {
3445 let source = r#"
3446 fn inb(port: u16) -> u8 {
3447 let result: u8 = 0;
3448 asm!("in al, dx",
3449 out("al") result,
3450 in("dx") port,
3451 options(nostack, nomem));
3452 return result;
3453 }
3454 "#;
3455 let mut parser = Parser::new(source);
3456 let file = parser.parse_file().unwrap();
3457 assert_eq!(file.items.len(), 1);
3458 }
3459
3460 #[test]
3461 fn test_parse_volatile_read() {
3462 let source = r#"
3463 fn read_mmio(addr: *mut u32) -> u32 {
3464 return volatile read<u32>(addr);
3465 }
3466 "#;
3467 let mut parser = Parser::new(source);
3468 let file = parser.parse_file().unwrap();
3469 assert_eq!(file.items.len(), 1);
3470 }
3471
3472 #[test]
3473 fn test_parse_volatile_write() {
3474 let source = r#"
3475 fn write_mmio(addr: *mut u32, value: u32) {
3476 volatile write<u32>(addr, value);
3477 }
3478 "#;
3479 let mut parser = Parser::new(source);
3480 let file = parser.parse_file().unwrap();
3481 assert_eq!(file.items.len(), 1);
3482 }
3483
3484 #[test]
3485 fn test_parse_naked_function() {
3486 let source = r#"
3487 naked fn interrupt_handler() {
3488 asm!("push rax; push rbx; call handler_impl; pop rbx; pop rax; iretq",
3489 options(nostack));
3490 }
3491 "#;
3492 let mut parser = Parser::new(source);
3493 let file = parser.parse_file().unwrap();
3494 assert_eq!(file.items.len(), 1);
3495
3496 if let Item::Function(func) = &file.items[0].node {
3497 assert!(func.attrs.naked, "Function should be naked");
3498 } else {
3499 panic!("Expected function");
3500 }
3501 }
3502
3503 #[test]
3504 fn test_parse_packed_struct() {
3505 let source = r#"
3506 packed struct GDTEntry {
3507 limit_low: u16,
3508 base_low: u16,
3509 base_middle: u8,
3510 access: u8,
3511 granularity: u8,
3512 base_high: u8,
3513 }
3514 "#;
3515 let mut parser = Parser::new(source);
3516 let file = parser.parse_file().unwrap();
3517 assert_eq!(file.items.len(), 1);
3518
3519 if let Item::Struct(s) = &file.items[0].node {
3520 assert!(s.attrs.packed, "Struct should be packed");
3521 assert_eq!(s.name.name, "GDTEntry");
3522 if let StructFields::Named(fields) = &s.fields {
3523 assert_eq!(fields.len(), 6);
3524 } else {
3525 panic!("Expected named fields");
3526 }
3527 } else {
3528 panic!("Expected struct");
3529 }
3530 }
3531
3532 #[test]
3533 fn test_parse_no_std_attribute() {
3534 let source = r#"
3535 #![no_std]
3536 #![no_main]
3537
3538 fn kernel_main() -> ! {
3539 loop {}
3540 }
3541 "#;
3542 let mut parser = Parser::new(source);
3543 let file = parser.parse_file().unwrap();
3544
3545 assert!(file.config.no_std, "Should have no_std");
3546 assert!(file.config.no_main, "Should have no_main");
3547 assert_eq!(file.attrs.len(), 2);
3548 }
3549
3550 #[test]
3551 fn test_parse_feature_attribute() {
3552 let source = r#"
3553 #![feature(asm, naked_functions)]
3554
3555 fn main() -> i64 { 0 }
3556 "#;
3557 let mut parser = Parser::new(source);
3558 let file = parser.parse_file().unwrap();
3559
3560 assert_eq!(file.config.features.len(), 2);
3561 assert!(file.config.features.contains(&"asm".to_string()));
3562 assert!(file.config.features.contains(&"naked_functions".to_string()));
3563 }
3564
3565 #[test]
3566 fn test_parse_target_attribute() {
3567 let source = r#"
3568 #![no_std]
3569 #![target(arch = "x86_64", os = "none")]
3570
3571 fn kernel_main() { }
3572 "#;
3573 let mut parser = Parser::new(source);
3574 let file = parser.parse_file().unwrap();
3575
3576 assert!(file.config.no_std);
3577 let target = file.config.target.as_ref().expect("Should have target config");
3578 assert_eq!(target.arch, Some("x86_64".to_string()));
3579 assert_eq!(target.os, Some("none".to_string()));
3580 }
3581
3582 #[test]
3583 fn test_parse_panic_handler() {
3584 let source = r#"
3585 #![no_std]
3586
3587 #[panic_handler]
3588 fn panic(info: *const PanicInfo) -> ! {
3589 loop {}
3590 }
3591 "#;
3592 let mut parser = Parser::new(source);
3593 let file = parser.parse_file().unwrap();
3594
3595 assert_eq!(file.items.len(), 1);
3596 if let Item::Function(func) = &file.items[0].node {
3597 assert!(func.attrs.panic_handler, "Should have panic_handler attribute");
3598 } else {
3599 panic!("Expected function");
3600 }
3601 }
3602
3603 #[test]
3604 fn test_parse_entry_point() {
3605 let source = r#"
3606 #![no_std]
3607 #![no_main]
3608
3609 #[entry]
3610 #[no_mangle]
3611 fn _start() -> ! {
3612 loop {}
3613 }
3614 "#;
3615 let mut parser = Parser::new(source);
3616 let file = parser.parse_file().unwrap();
3617
3618 assert_eq!(file.items.len(), 1);
3619 if let Item::Function(func) = &file.items[0].node {
3620 assert!(func.attrs.entry, "Should have entry attribute");
3621 assert!(func.attrs.no_mangle, "Should have no_mangle attribute");
3622 } else {
3623 panic!("Expected function");
3624 }
3625 }
3626
3627 #[test]
3628 fn test_parse_link_section() {
3629 let source = r#"
3630 #[link_section = ".text.boot"]
3631 fn boot_code() { }
3632 "#;
3633 let mut parser = Parser::new(source);
3634 let file = parser.parse_file().unwrap();
3635
3636 assert_eq!(file.items.len(), 1);
3637 if let Item::Function(func) = &file.items[0].node {
3638 assert_eq!(func.attrs.link_section, Some(".text.boot".to_string()));
3639 } else {
3640 panic!("Expected function");
3641 }
3642 }
3643
3644 #[test]
3645 fn test_parse_linker_config() {
3646 let source = r#"
3647 #![no_std]
3648 #![linker_script = "kernel.ld"]
3649 #![entry_point = "_start"]
3650 #![base_address = 0x100000]
3651 #![stack_size = 0x4000]
3652
3653 fn kernel_main() { }
3654 "#;
3655 let mut parser = Parser::new(source);
3656 let file = parser.parse_file().unwrap();
3657
3658 let linker = file.config.linker.as_ref().expect("Should have linker config");
3659 assert_eq!(linker.script, Some("kernel.ld".to_string()));
3660 assert_eq!(linker.entry_point, Some("_start".to_string()));
3661 assert_eq!(linker.base_address, Some(0x100000));
3662 assert_eq!(linker.stack_size, Some(0x4000));
3663 }
3664
3665 #[test]
3666 fn test_parse_interrupt_handler() {
3667 let source = r#"
3668 #[interrupt(32)]
3669 #[naked]
3670 fn timer_handler() {
3671 asm!("iretq", options(nostack));
3672 }
3673 "#;
3674 let mut parser = Parser::new(source);
3675 let file = parser.parse_file().unwrap();
3676
3677 if let Item::Function(func) = &file.items[0].node {
3678 assert_eq!(func.attrs.interrupt, Some(32));
3679 assert!(func.attrs.naked);
3680 } else {
3681 panic!("Expected function");
3682 }
3683 }
3684
3685 #[test]
3686 fn test_parse_inline_attributes() {
3687 let source = r#"
3688 #[inline]
3689 fn fast() -> i64 { 0 }
3690
3691 #[inline(always)]
3692 fn very_fast() -> i64 { 0 }
3693
3694 #[inline(never)]
3695 fn never_inline() -> i64 { 0 }
3696 "#;
3697 let mut parser = Parser::new(source);
3698 let file = parser.parse_file().unwrap();
3699
3700 assert_eq!(file.items.len(), 3);
3701
3702 if let Item::Function(func) = &file.items[0].node {
3703 assert_eq!(func.attrs.inline, Some(InlineHint::Hint));
3704 }
3705 if let Item::Function(func) = &file.items[1].node {
3706 assert_eq!(func.attrs.inline, Some(InlineHint::Always));
3707 }
3708 if let Item::Function(func) = &file.items[2].node {
3709 assert_eq!(func.attrs.inline, Some(InlineHint::Never));
3710 }
3711 }
3712
3713 #[test]
3714 fn test_parse_simd_type() {
3715 let source = r#"
3716 fn vec_add(a: simd<f32, 4>, b: simd<f32, 4>) -> simd<f32, 4> {
3717 return simd.add(a, b);
3718 }
3719 "#;
3720 let mut parser = Parser::new(source);
3721 let file = parser.parse_file().unwrap();
3722 assert_eq!(file.items.len(), 1);
3723
3724 if let Item::Function(func) = &file.items[0].node {
3725 assert_eq!(func.name.name, "vec_add");
3726 if let TypeExpr::Simd { element, lanes } = &func.params[0].ty {
3728 assert_eq!(*lanes, 4);
3729 if let TypeExpr::Path(path) = element.as_ref() {
3730 assert_eq!(path.segments[0].ident.name, "f32");
3731 }
3732 } else {
3733 panic!("Expected SIMD type");
3734 }
3735 } else {
3736 panic!("Expected function");
3737 }
3738 }
3739
3740 #[test]
3741 fn test_parse_simd_literal() {
3742 let source = r#"
3743 fn make_vec() -> simd<f32, 4> {
3744 return simd[1.0, 2.0, 3.0, 4.0];
3745 }
3746 "#;
3747 let mut parser = Parser::new(source);
3748 let file = parser.parse_file().unwrap();
3749 assert_eq!(file.items.len(), 1);
3750 }
3751
3752 #[test]
3753 fn test_parse_simd_intrinsics() {
3754 let source = r#"
3755 fn dot_product(a: simd<f32, 4>, b: simd<f32, 4>) -> f32 {
3756 let prod = simd.mul(a, b);
3757 return simd.hadd(prod);
3758 }
3759 "#;
3760 let mut parser = Parser::new(source);
3761 let file = parser.parse_file().unwrap();
3762 assert_eq!(file.items.len(), 1);
3763 }
3764
3765 #[test]
3766 fn test_parse_simd_shuffle() {
3767 let source = r#"
3768 fn interleave(a: simd<f32, 4>, b: simd<f32, 4>) -> simd<f32, 4> {
3769 return simd.shuffle(a, b, [0, 4, 1, 5]);
3770 }
3771 "#;
3772 let mut parser = Parser::new(source);
3773 let file = parser.parse_file().unwrap();
3774 assert_eq!(file.items.len(), 1);
3775 }
3776
3777 #[test]
3778 fn test_parse_atomic_type() {
3779 let source = r#"
3780 struct Counter {
3781 value: atomic<i64>,
3782 }
3783 "#;
3784 let mut parser = Parser::new(source);
3785 let file = parser.parse_file().unwrap();
3786 assert_eq!(file.items.len(), 1);
3787
3788 if let Item::Struct(s) = &file.items[0].node {
3789 if let StructFields::Named(fields) = &s.fields {
3790 if let TypeExpr::Atomic(inner) = &fields[0].ty {
3791 if let TypeExpr::Path(path) = inner.as_ref() {
3792 assert_eq!(path.segments[0].ident.name, "i64");
3793 }
3794 } else {
3795 panic!("Expected atomic type");
3796 }
3797 }
3798 } else {
3799 panic!("Expected struct");
3800 }
3801 }
3802
3803 #[test]
3804 fn test_parse_atomic_operations() {
3805 let source = r#"
3806 fn increment(ptr: *mut i64) -> i64 {
3807 return atomic.fetch_add(ptr, 1, SeqCst);
3808 }
3809 "#;
3810 let mut parser = Parser::new(source);
3811 let file = parser.parse_file().unwrap();
3812 assert_eq!(file.items.len(), 1);
3813 }
3814
3815 #[test]
3816 fn test_parse_atomic_compare_exchange() {
3817 let source = r#"
3818 fn cas(ptr: *mut i64, expected: i64, new: i64) -> bool {
3819 let result = atomic.compare_exchange(ptr, expected, new, AcqRel, Relaxed);
3820 return result;
3821 }
3822 "#;
3823 let mut parser = Parser::new(source);
3824 let file = parser.parse_file().unwrap();
3825 assert_eq!(file.items.len(), 1);
3826 }
3827
3828 #[test]
3829 fn test_parse_atomic_fence() {
3830 let source = r#"
3831 fn memory_barrier() {
3832 atomic.fence(SeqCst);
3833 }
3834 "#;
3835 let mut parser = Parser::new(source);
3836 let file = parser.parse_file().unwrap();
3837 assert_eq!(file.items.len(), 1);
3838 }
3839
3840 #[test]
3841 fn test_parse_derive_macro() {
3842 let source = r#"
3843 #[derive(Debug, Clone, Component)]
3844 struct Position {
3845 x: f32,
3846 y: f32,
3847 z: f32,
3848 }
3849 "#;
3850 let mut parser = Parser::new(source);
3851 let file = parser.parse_file().unwrap();
3852 assert_eq!(file.items.len(), 1);
3853
3854 if let Item::Struct(s) = &file.items[0].node {
3855 assert_eq!(s.attrs.derives.len(), 3);
3856 assert!(matches!(s.attrs.derives[0], DeriveTrait::Debug));
3857 assert!(matches!(s.attrs.derives[1], DeriveTrait::Clone));
3858 assert!(matches!(s.attrs.derives[2], DeriveTrait::Component));
3859 } else {
3860 panic!("Expected struct");
3861 }
3862 }
3863
3864 #[test]
3865 fn test_parse_repr_c_struct() {
3866 let source = r#"
3867 #[repr(C)]
3868 struct FFIStruct {
3869 field: i32,
3870 }
3871 "#;
3872 let mut parser = Parser::new(source);
3873 let file = parser.parse_file().unwrap();
3874 assert_eq!(file.items.len(), 1);
3875
3876 if let Item::Struct(s) = &file.items[0].node {
3877 assert_eq!(s.attrs.repr, Some(StructRepr::C));
3878 } else {
3879 panic!("Expected struct");
3880 }
3881 }
3882
3883 #[test]
3884 fn test_parse_allocator_trait() {
3885 let source = r#"
3886 trait Allocator {
3887 type Error;
3888
3889 fn allocate(size: usize, align: usize) -> *mut u8;
3890 fn deallocate(ptr: *mut u8, size: usize, align: usize);
3891 }
3892 "#;
3893 let mut parser = Parser::new(source);
3894 let file = parser.parse_file().unwrap();
3895 assert_eq!(file.items.len(), 1);
3896
3897 if let Item::Trait(t) = &file.items[0].node {
3898 assert_eq!(t.name.name, "Allocator");
3899 assert_eq!(t.items.len(), 3); assert!(matches!(t.items[0], TraitItem::Type { .. }));
3901 } else {
3902 panic!("Expected trait");
3903 }
3904 }
3905
3906 #[test]
3907 fn test_parse_where_clause() {
3908 let source = r#"
3909 fn alloc_array<T, A>(allocator: &mut A, count: usize) -> *mut T
3910 where
3911 A: Allocator,
3912 {
3913 return allocator.allocate(count, 8);
3914 }
3915 "#;
3916 let mut parser = Parser::new(source);
3917 let file = parser.parse_file().unwrap();
3918 assert_eq!(file.items.len(), 1);
3919
3920 if let Item::Function(func) = &file.items[0].node {
3921 assert!(func.where_clause.is_some());
3922 let wc = func.where_clause.as_ref().unwrap();
3923 assert_eq!(wc.predicates.len(), 1);
3924 } else {
3925 panic!("Expected function");
3926 }
3927 }
3928}