opexywtf

Untitled

Aug 21st, 2025
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 20.10 KB | None | 0 0
  1. fn is_at_end(&self) -> bool {
  2.         self.position >= self.input.len()
  3.     }
  4. }
  5.  
  6. // ============================================================================
  7. // src/compiler/parser.rs - Parser Implementation
  8. // ============================================================================
  9.  
  10. use super::ast::*;
  11. use super::lexer::{Token, TokenType};
  12. use crate::diagnostics::{DiagnosticEngine, Error, Result, Span};
  13.  
  14. pub struct Parser<'a> {
  15.    tokens: Vec<Token>,
  16.    current: usize,
  17.    diagnostics: &'a mut DiagnosticEngine,
  18. }
  19.  
  20. impl<'a> Parser<'a> {
  21.     pub fn new(tokens: Vec<Token>, diagnostics: &'a mut DiagnosticEngine) -> Self {
  22.        Self {
  23.            tokens,
  24.            current: 0,
  25.            diagnostics,
  26.        }
  27.    }
  28.    
  29.    pub fn parse(&mut self) -> Result<Program> {
  30.        let mut imports = Vec::new();
  31.        let mut items = Vec::new();
  32.        
  33.        // Parse imports first
  34.        while self.match_token(&TokenType::Import) {
  35.            imports.push(self.parse_import()?);
  36.        }
  37.        
  38.        // Parse items
  39.        while !self.is_at_end() {
  40.            if self.match_token(&TokenType::Newline) {
  41.                continue; // Skip newlines
  42.            }
  43.            items.push(self.parse_item()?);
  44.        }
  45.        
  46.        Ok(Program { items, imports })
  47.    }
  48.    
  49.    fn parse_import(&mut self) -> Result<Import> {
  50.        let start_span = self.previous().span.clone();
  51.        
  52.        if let TokenType::Identifier(module_path) = &self.advance().token_type {
  53.            Ok(Import {
  54.                module_path: module_path.clone(),
  55.                span: start_span,
  56.            })
  57.        } else {
  58.            Err(Error::ParseError("Expected module name after 'import'".to_string()))
  59.        }
  60.    }
  61.    
  62.    fn parse_item(&mut self) -> Result<Item> {
  63.        match &self.peek().token_type {
  64.            TokenType::Fn => Ok(Item::Function(self.parse_function()?)),
  65.            TokenType::Struct => Ok(Item::Struct(self.parse_struct()?)),
  66.            TokenType::Let => Ok(Item::Constant(self.parse_constant()?)),
  67.            TokenType::Var => Ok(Item::Variable(self.parse_variable()?)),
  68.            _ => Err(Error::ParseError("Expected function, struct, let, or var".to_string())),
  69.        }
  70.    }
  71.    
  72.    fn parse_function(&mut self) -> Result<Function> {
  73.        let start_span = self.advance().span.clone(); // consume 'fn'
  74.        
  75.        let name = if let TokenType::Identifier(name) = &self.advance().token_type {
  76.            name.clone()
  77.        } else {
  78.            return Err(Error::ParseError("Expected function name".to_string()));
  79.        };
  80.        
  81.        self.consume(&TokenType::LeftParen, "Expected '(' after function name")?;
  82.        
  83.        let mut parameters = Vec::new();
  84.        if !self.check(&TokenType::RightParen) {
  85.            loop {
  86.                parameters.push(self.parse_parameter()?);
  87.                if !self.match_token(&TokenType::Comma) {
  88.                    break;
  89.                }
  90.            }
  91.        }
  92.        
  93.        self.consume(&TokenType::RightParen, "Expected ')' after parameters")?;
  94.        self.consume(&TokenType::Arrow, "Expected '->' before return type")?;
  95.        
  96.        let return_type = self.parse_type()?;
  97.        let body = self.parse_block()?;
  98.        
  99.        Ok(Function {
  100.            name,
  101.            parameters,
  102.            return_type,
  103.            body,
  104.            span: start_span,
  105.        })
  106.    }
  107.    
  108.    fn parse_parameter(&mut self) -> Result<Parameter> {
  109.        let start_span = self.peek().span.clone();
  110.        
  111.        let name = if let TokenType::Identifier(name) = &self.advance().token_type {
  112.            name.clone()
  113.        } else {
  114.            return Err(Error::ParseError("Expected parameter name".to_string()));
  115.        };
  116.        
  117.        self.consume(&TokenType::Colon, "Expected ':' after parameter name")?;
  118.        let param_type = self.parse_type()?;
  119.        
  120.        let default_value = if self.match_token(&TokenType::Assign) {
  121.            Some(self.parse_expression()?)
  122.        } else {
  123.            None
  124.        };
  125.        
  126.        Ok(Parameter {
  127.            name,
  128.            param_type,
  129.            default_value,
  130.            span: start_span,
  131.        })
  132.    }
  133.    
  134.    fn parse_struct(&mut self) -> Result<Struct> {
  135.        let start_span = self.advance().span.clone(); // consume 'struct'
  136.        
  137.        let name = if let TokenType::Identifier(name) = &self.advance().token_type {
  138.            name.clone()
  139.        } else {
  140.            return Err(Error::ParseError("Expected struct name".to_string()));
  141.        };
  142.        
  143.        self.consume(&TokenType::LeftBrace, "Expected '{' after struct name")?;
  144.        
  145.        let mut fields = Vec::new();
  146.        while !self.check(&TokenType::RightBrace) && !self.is_at_end() {
  147.            fields.push(self.parse_field()?);
  148.            if self.match_token(&TokenType::Comma) {
  149.                continue;
  150.            }
  151.        }
  152.        
  153.        self.consume(&TokenType::RightBrace, "Expected '}' after struct fields")?;
  154.        
  155.        Ok(Struct {
  156.            name,
  157.            fields,
  158.            span: start_span,
  159.        })
  160.    }
  161.    
  162.    fn parse_field(&mut self) -> Result<Field> {
  163.        let start_span = self.peek().span.clone();
  164.        
  165.        let name = if let TokenType::Identifier(name) = &self.advance().token_type {
  166.            name.clone()
  167.        } else {
  168.            return Err(Error::ParseError("Expected field name".to_string()));
  169.        };
  170.        
  171.        self.consume(&TokenType::Colon, "Expected ':' after field name")?;
  172.        let field_type = self.parse_type()?;
  173.        
  174.        Ok(Field {
  175.            name,
  176.            field_type,
  177.            span: start_span,
  178.        })
  179.    }
  180.    
  181.    fn parse_constant(&mut self) -> Result<Constant> {
  182.        let start_span = self.advance().span.clone(); // consume 'let'
  183.        
  184.        let name = if let TokenType::Identifier(name) = &self.advance().token_type {
  185.            name.clone()
  186.        } else {
  187.            return Err(Error::ParseError("Expected constant name".to_string()));
  188.        };
  189.        
  190.        self.consume(&TokenType::Colon, "Expected ':' after constant name")?;
  191.        let const_type = self.parse_type()?;
  192.        self.consume(&TokenType::Assign, "Expected '=' after constant type")?;
  193.        let value = self.parse_expression()?;
  194.        
  195.        Ok(Constant {
  196.            name,
  197.            const_type,
  198.            value,
  199.            span: start_span,
  200.        })
  201.    }
  202.    
  203.    fn parse_variable(&mut self) -> Result<Variable> {
  204.        let start_span = self.advance().span.clone(); // consume 'var'
  205.        
  206.        let name = if let TokenType::Identifier(name) = &self.advance().token_type {
  207.            name.clone()
  208.        } else {
  209.            return Err(Error::ParseError("Expected variable name".to_string()));
  210.        };
  211.        
  212.        self.consume(&TokenType::Colon, "Expected ':' after variable name")?;
  213.        let var_type = self.parse_type()?;
  214.        self.consume(&TokenType::Assign, "Expected '=' after variable type")?;
  215.        let initializer = self.parse_expression()?;
  216.        
  217.        Ok(Variable {
  218.            name,
  219.            var_type,
  220.            initializer,
  221.            mutable: true,
  222.            span: start_span,
  223.        })
  224.    }
  225.    
  226.    fn parse_type(&mut self) -> Result<Type> {
  227.        match &self.advance().token_type {
  228.            TokenType::IntType => Ok(Type::Int),
  229.            TokenType::FloatType => Ok(Type::Float),
  230.            TokenType::StrType => Ok(Type::Str),
  231.            TokenType::BoolType => Ok(Type::Bool),
  232.            TokenType::VoidType => Ok(Type::Void),
  233.            TokenType::LeftBracket => {
  234.                let inner_type = self.parse_type()?;
  235.                self.consume(&TokenType::RightBracket, "Expected ']' after list type")?;
  236.                Ok(Type::List(Box::new(inner_type)))
  237.            }
  238.            TokenType::Identifier(name) => Ok(Type::Struct(name.clone())),
  239.            _ => Err(Error::ParseError("Expected type".to_string())),
  240.        }
  241.    }
  242.    
  243.    fn parse_block(&mut self) -> Result<Block> {
  244.        let start_span = self.peek().span.clone();
  245.        self.consume(&TokenType::LeftBrace, "Expected '{'")?;
  246.        
  247.        let mut statements = Vec::new();
  248.        while !self.check(&TokenType::RightBrace) && !self.is_at_end() {
  249.            if self.match_token(&TokenType::Newline) {
  250.                continue;
  251.            }
  252.            statements.push(self.parse_statement()?);
  253.        }
  254.        
  255.        self.consume(&TokenType::RightBrace, "Expected '}'")?;
  256.        
  257.        Ok(Block {
  258.            statements,
  259.            span: start_span,
  260.        })
  261.    }
  262.    
  263.    fn parse_statement(&mut self) -> Result<Statement> {
  264.        match &self.peek().token_type {
  265.            TokenType::Let => {
  266.                let var = self.parse_constant()?;
  267.                Ok(Statement::Variable(Variable {
  268.                    name: var.name,
  269.                    var_type: var.const_type,
  270.                    initializer: var.value,
  271.                    mutable: false,
  272.                    span: var.span,
  273.                }))
  274.            }
  275.            TokenType::Var => Ok(Statement::Variable(self.parse_variable()?)),
  276.            TokenType::If => Ok(Statement::If(self.parse_if_statement()?)),
  277.            TokenType::For => Ok(Statement::For(self.parse_for_loop()?)),
  278.            TokenType::Try => Ok(Statement::Try(self.parse_try_statement()?)),
  279.            TokenType::Return => Ok(Statement::Return(self.parse_return_statement()?)),
  280.            _ => {
  281.                // Check if it's an assignment or expression
  282.                 let expr = self.parse_expression()?;
  283.                 if self.match_token(&TokenType::Assign) {
  284.                     let value = self.parse_expression()?;
  285.                     Ok(Statement::Assignment(Assignment {
  286.                         target: expr,
  287.                         value,
  288.                         span: self.previous().span.clone(),
  289.                     }))
  290.                 } else {
  291.                     Ok(Statement::Expression(expr))
  292.                 }
  293.             }
  294.         }
  295.     }
  296.    
  297.     fn parse_if_statement(&mut self) -> Result<IfStatement> {
  298.         let start_span = self.advance().span.clone(); // consume 'if'
  299.        
  300.         let condition = self.parse_expression()?;
  301.         let then_block = self.parse_block()?;
  302.        
  303.         let mut else_ifs = Vec::new();
  304.         while self.match_token(&TokenType::Else) && self.check(&TokenType::If) {
  305.             self.advance(); // consume 'if'
  306.             let else_if_condition = self.parse_expression()?;
  307.             let else_if_block = self.parse_block()?;
  308.             else_ifs.push((else_if_condition, else_if_block));
  309.         }
  310.        
  311.         let else_block = if self.match_token(&TokenType::Else) {
  312.             Some(self.parse_block()?)
  313.         } else {
  314.             None
  315.         };
  316.        
  317.         Ok(IfStatement {
  318.             condition,
  319.             then_block,
  320.             else_ifs,
  321.             else_block,
  322.             span: start_span,
  323.         })
  324.     }
  325.    
  326.     fn parse_for_loop(&mut self) -> Result<ForLoop> {
  327.         let start_span = self.advance().span.clone(); // consume 'for'
  328.        
  329.         let variable = if let TokenType::Identifier(name) = &self.advance().token_type {
  330.             name.clone()
  331.         } else {
  332.             return Err(Error::ParseError("Expected variable name in for loop".to_string()));
  333.         };
  334.        
  335.         self.consume(&TokenType::In, "Expected 'in' after for loop variable")?;
  336.         let iterable = self.parse_expression()?;
  337.         let body = self.parse_block()?;
  338.        
  339.         Ok(ForLoop {
  340.             variable,
  341.             iterable,
  342.             body,
  343.             span: start_span,
  344.         })
  345.     }
  346.    
  347.     fn parse_try_statement(&mut self) -> Result<TryStatement> {
  348.         let start_span = self.advance().span.clone(); // consume 'try'
  349.        
  350.         let try_block = self.parse_block()?;
  351.        
  352.         let mut catch_clauses = Vec::new();
  353.         while self.match_token(&TokenType::Catch) {
  354.             let exception_type = if let TokenType::Identifier(name) = &self.advance().token_type {
  355.                 name.clone()
  356.             } else {
  357.                 return Err(Error::ParseError("Expected exception type after 'catch'".to_string()));
  358.             };
  359.            
  360.             let handler_block = self.parse_block()?;
  361.            
  362.             catch_clauses.push(CatchClause {
  363.                 exception_type,
  364.                 handler_block,
  365.                 span: self.previous().span.clone(),
  366.             });
  367.         }
  368.        
  369.         Ok(TryStatement {
  370.             try_block,
  371.             catch_clauses,
  372.             span: start_span,
  373.         })
  374.     }
  375.    
  376.     fn parse_return_statement(&mut self) -> Result<ReturnStatement> {
  377.         let start_span = self.advance().span.clone(); // consume 'return'
  378.        
  379.         let value = if !self.check(&TokenType::Newline) && !self.check(&TokenType::RightBrace) {
  380.             Some(self.parse_expression()?)
  381.         } else {
  382.             None
  383.         };
  384.        
  385.         Ok(ReturnStatement {
  386.             value,
  387.             span: start_span,
  388.         })
  389.     }
  390.    
  391.     fn parse_expression(&mut self) -> Result<Expression> {
  392.         self.parse_or()
  393.     }
  394.    
  395.     fn parse_or(&mut self) -> Result<Expression> {
  396.         let mut expr = self.parse_and()?;
  397.        
  398.         while self.match_token(&TokenType::Or) {
  399.             let operator = BinaryOperator::Or;
  400.             let right = self.parse_and()?;
  401.             expr = Expression::Binary(BinaryOp {
  402.                 left: Box::new(expr),
  403.                 operator,
  404.                 right: Box::new(right),
  405.                 span: self.previous().span.clone(),
  406.             });
  407.         }
  408.        
  409.         Ok(expr)
  410.     }
  411.    
  412.     fn parse_and(&mut self) -> Result<Expression> {
  413.         let mut expr = self.parse_equality()?;
  414.        
  415.         while self.match_token(&TokenType::And) {
  416.             let operator = BinaryOperator::And;
  417.             let right = self.parse_equality()?;
  418.             expr = Expression::Binary(BinaryOp {
  419.                 left: Box::new(expr),
  420.                 operator,
  421.                 right: Box::new(right),
  422.                 span: self.previous().span.clone(),
  423.             });
  424.         }
  425.        
  426.         Ok(expr)
  427.     }
  428.    
  429.     fn parse_equality(&mut self) -> Result<Expression> {
  430.         let mut expr = self.parse_comparison()?;
  431.        
  432.         while let Some(op) = self.match_equality_operator() {
  433.             let right = self.parse_comparison()?;
  434.             expr = Expression::Binary(BinaryOp {
  435.                 left: Box::new(expr),
  436.                 operator: op,
  437.                 right: Box::new(right),
  438.                 span: self.previous().span.clone(),
  439.             });
  440.         }
  441.        
  442.         Ok(expr)
  443.     }
  444.    
  445.     fn parse_comparison(&mut self) -> Result<Expression> {
  446.         let mut expr = self.parse_term()?;
  447.        
  448.         while let Some(op) = self.match_comparison_operator() {
  449.             let right = self.parse_term()?;
  450.             expr = Expression::Binary(BinaryOp {
  451.                 left: Box::new(expr),
  452.                 operator: op,
  453.                 right: Box::new(right),
  454.                 span: self.previous().span.clone(),
  455.             });
  456.         }
  457.        
  458.         Ok(expr)
  459.     }
  460.    
  461.     fn parse_term(&mut self) -> Result<Expression> {
  462.         let mut expr = self.parse_factor()?;
  463.        
  464.         while let Some(op) = self.match_term_operator() {
  465.             let right = self.parse_factor()?;
  466.             expr = Expression::Binary(BinaryOp {
  467.                 left: Box::new(expr),
  468.                 operator: op,
  469.                 right: Box::new(right),
  470.                 span: self.previous().span.clone(),
  471.             });
  472.         }
  473.        
  474.         Ok(expr)
  475.     }
  476.    
  477.     fn parse_factor(&mut self) -> Result<Expression> {
  478.         let mut expr = self.parse_unary()?;
  479.        
  480.         while let Some(op) = self.match_factor_operator() {
  481.             let right = self.parse_unary()?;
  482.             expr = Expression::Binary(BinaryOp {
  483.                 left: Box::new(expr),
  484.                 operator: op,
  485.                 right: Box::new(right),
  486.                 span: self.previous().span.clone(),
  487.             });
  488.         }
  489.        
  490.         Ok(expr)
  491.     }
  492.    
  493.     fn parse_unary(&mut self) -> Result<Expression> {
  494.         if let Some(op) = self.match_unary_operator() {
  495.             let operand = self.parse_unary()?;
  496.             Ok(Expression::Unary(UnaryOp {
  497.                 operator: op,
  498.                 operand: Box::new(operand),
  499.                 span: self.previous().span.clone(),
  500.             }))
  501.         } else {
  502.             self.parse_call()
  503.         }
  504.     }
  505.    
  506.     fn parse_call(&mut self) -> Result<Expression> {
  507.         let mut expr = self.parse_primary()?;
  508.        
  509.         loop {
  510.             if self.match_token(&TokenType::LeftParen) {
  511.                 expr = self.finish_call(expr)?;
  512.             } else if self.match_token(&TokenType::Dot) {
  513.                 let name = if let TokenType::Identifier(name) = &self.advance().token_type {
  514.                     name.clone()
  515.                 } else {
  516.                     return Err(Error::ParseError("Expected property name after '.'".to_string()));
  517.                 };
  518.                 expr = Expression::MemberAccess(MemberAccess {
  519.                     object: Box::new(expr),
  520.                     member: name,
  521.                     span: self.previous().span.clone(),
  522.                 });
  523.             } else {
  524.                 break;
  525.             }
  526.         }
  527.        
  528.         Ok(expr)
  529.     }
  530.    
  531.     fn finish_call(&mut self, callee: Expression) -> Result<Expression> {
  532.         let mut arguments = Vec::new();
  533.        
  534.         if !self.check(&TokenType::RightParen) {
  535.             loop {
  536.                 arguments.push(self.parse_expression()?);
  537.                 if !self.match_token(&TokenType::Comma) {
  538.                     break;
  539.                 }
  540.             }
  541.         }
  542.        
  543.         self.consume(&TokenType::RightParen, "Expected ')' after arguments")?;
  544.        
  545.         Ok(Expression::Call(FunctionCall {
  546.             function: Box::new(callee),
  547.             arguments,
  548.             span: self.previous().span.clone(),
  549.         }))
  550.     }
  551.    
  552.     fn parse_primary(&mut self) -> Result<Expression> {
  553.         match &self.advance().token_type {
  554.             TokenType::Boolean(b) => Ok(Expression::Literal(Literal::Boolean(*b))),
  555.             TokenType::Integer(n) => Ok(Expression::Literal(Literal::Integer(*n))),
  556.             TokenType::Float(f) => Ok(Expression::Literal(Literal::Float(*f))),
  557.             TokenType::String(s) => Ok(Expression::Literal(Literal::String(s.clone()))),
  558.             TokenType::Identifier(name) => {
  559.                 if self.match_token(&TokenType::LeftBrace) {
  560.                     // Struct initialization
  561.                     let mut fields = std::collections::HashMap::new();
  562.                    
  563.                     while !self.check(&TokenType::RightBrace) && !self.is_at_end() {
  564.                         let field_name = if let TokenType::Identifier(name) = &self.advance().token_type {
  565.                             name.clone()
  566.                         } else {
  567.                             return Err(Error::ParseError("Expected field name".to_string()));
  568.                         };
  569.                        
  570.                         self.consume(&TokenType::Colon, "Expected ':' after field name")?;
  571.                         let field_value = self.parse_expression()?;
  572.                        
  573.                         fields.insert(field_name, field_value);
  574.                        
  575.                         if !self.match_token(&TokenType::Comma) {
  576.                             break;
  577.                         }
  578.                     }
  579.                    
  580.                     self.consume(&TokenType::RightBrace, "Expected '}' after struct fields")?;
  581.                    
  582.                     Ok(Expression::StructInit(StructInitializer {
  583.                         struct_name: name.clone(),
  584.                         fields,
  585.                         span: self.previous().span.clone(),
  586.            
Advertisement
Add Comment
Please, Sign In to add comment