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