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