sigil_parser/
parser.rs

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