use crate::ast::*;
use crate::error::{CompilerError, Result};
use crate::lexer::{Token, Keyword};
pub struct Parser {
tokens: Vec<Token>,
position: usize,
}
impl Parser {
pub fn new(tokens: Vec<Token>) -> Self {
Self {
tokens,
position: 0,
}
}
pub fn parse(&mut self) -> Result<Program> {
let mut statements = Vec::new();
let mut iterations = 0;
let max_iterations = self.tokens.len() * 2; let mut errors = Vec::new();
while self.position < self.tokens.len() && iterations < max_iterations {
let old_position = self.position;
match self.parse_statement() {
Ok(Some(statement)) => {
statements.push(statement);
}
Ok(None) => {
break;
}
Err(error) => {
errors.push(error);
self.advance();
}
}
if self.position == old_position {
self.position += 1;
}
if self.position < self.tokens.len() {
let current_token = &self.tokens[self.position];
if matches!(current_token, Token::EOF) {
break;
}
}
iterations += 1;
}
if iterations >= max_iterations {
return Err(CompilerError::parse_error(
self.position,
1,
"Parser stuck in infinite loop".to_string(),
));
}
if !statements.is_empty() {
Ok(Program { statements })
} else if !errors.is_empty() {
Err(errors.into_iter().next().unwrap())
} else {
Ok(Program { statements })
}
}
fn parse_statement(&mut self) -> Result<Option<Statement>> {
if self.position >= self.tokens.len() {
return Ok(None);
}
if self.current_token() == &Token::EOF {
return Ok(None);
}
let token = &self.tokens[self.position];
let statement = match token {
Token::EOF => return Ok(None),
Token::Keyword(keyword) => match keyword {
crate::lexer::Keyword::Let
| crate::lexer::Keyword::Var => self.parse_variable_declaration()?,
crate::lexer::Keyword::Const => {
if self.position + 1 < self.tokens.len() {
if let Token::Keyword(crate::lexer::Keyword::Enum) = &self.tokens[self.position + 1] {
self.parse_const_enum_declaration()?
} else {
self.parse_variable_declaration()?
}
} else {
self.parse_variable_declaration()?
}
},
crate::lexer::Keyword::Function => self.parse_function_declaration()?,
crate::lexer::Keyword::Class => self.parse_class_declaration()?,
crate::lexer::Keyword::Interface => self.parse_interface_declaration()?,
crate::lexer::Keyword::Type => self.parse_type_alias()?,
crate::lexer::Keyword::Enum => self.parse_enum_declaration()?,
crate::lexer::Keyword::Import => self.parse_import_declaration()?,
crate::lexer::Keyword::Export => self.parse_export_declaration()?,
crate::lexer::Keyword::Namespace => self.parse_namespace_declaration()?,
crate::lexer::Keyword::Module => self.parse_module_declaration()?,
crate::lexer::Keyword::Declare => self.parse_declare_statement()?,
crate::lexer::Keyword::Return => self.parse_return_statement()?,
crate::lexer::Keyword::Throw => self.parse_throw_statement()?,
crate::lexer::Keyword::If => self.parse_if_statement()?,
crate::lexer::Keyword::Else => self.parse_expression_statement()?,
_ => self.parse_expression_statement()?,
},
Token::LeftBrace => self.parse_block_statement()?,
Token::Semicolon => {
self.advance();
return self.parse_statement();
}
_ => {
match self.parse_expression_statement() {
Ok(expr_stmt) => expr_stmt,
Err(_) => {
self.advance();
return Ok(None);
}
}
}
};
Ok(Some(statement))
}
fn parse_variable_declaration(&mut self) -> Result<Statement> {
let keyword = self.expect_keyword()?;
let name = self.expect_identifier()?;
let type_annotation = if self.current_token() == &Token::Colon {
self.advance();
Some(self.parse_type()?)
} else {
None
};
let initializer = if self.current_token() == &Token::Assign {
self.advance();
Some(self.parse_expression()?)
} else {
None
};
self.expect_semicolon()?;
Ok(Statement::VariableDeclaration(VariableDeclaration {
keyword,
name,
type_annotation,
initializer,
}))
}
fn parse_function_declaration(&mut self) -> Result<Statement> {
self.expect_keyword()?; let name = self.expect_identifier()?;
let type_parameters = self.parse_type_parameters()?;
let parameters = self.parse_parameters()?;
let return_type = if self.current_token() == &Token::Colon {
self.advance();
Some(self.parse_type()?)
} else {
None
};
let body = self.parse_block_statement()?;
Ok(Statement::FunctionDeclaration(FunctionDeclaration {
name,
type_parameters,
parameters,
return_type,
body: Box::new(body),
}))
}
fn parse_class_declaration(&mut self) -> Result<Statement> {
self.expect_keyword()?; let name = self.expect_identifier()?;
let type_parameters = self.parse_type_parameters()?;
let extends = if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Extends) {
self.advance();
Some(self.parse_type()?)
} else {
None
};
let implements = self.parse_implements()?;
let body = self.parse_class_body()?;
Ok(Statement::ClassDeclaration(ClassDeclaration {
name,
type_parameters,
extends,
implements,
body,
}))
}
fn parse_interface_declaration(&mut self) -> Result<Statement> {
self.expect_keyword()?; let name = self.expect_identifier()?;
let type_parameters = self.parse_type_parameters()?;
let extends = self.parse_extends()?;
let body = self.parse_interface_body()?;
Ok(Statement::InterfaceDeclaration(InterfaceDeclaration {
name,
type_parameters,
extends,
body,
}))
}
fn parse_type_alias(&mut self) -> Result<Statement> {
self.expect_keyword()?; let name = self.expect_identifier()?;
let type_parameters = self.parse_type_parameters()?;
self.expect_token(&Token::Assign)?;
let type_definition = self.parse_type()?;
self.expect_semicolon()?;
Ok(Statement::TypeAlias(TypeAlias {
name,
type_parameters,
type_definition,
}))
}
fn parse_enum_declaration(&mut self) -> Result<Statement> {
self.expect_keyword()?; let name = self.expect_identifier()?;
let members = self.parse_enum_members()?;
Ok(Statement::EnumDeclaration(EnumDeclaration {
name,
members,
}))
}
fn parse_const_enum_declaration(&mut self) -> Result<Statement> {
self.expect_keyword()?; self.expect_keyword()?; let name = self.expect_identifier()?;
let members = self.parse_enum_members()?;
Ok(Statement::EnumDeclaration(EnumDeclaration {
name,
members,
}))
}
fn parse_import_declaration(&mut self) -> Result<Statement> {
self.expect_keyword()?; let specifiers = self.parse_import_specifiers()?;
self.expect_keyword()?; let source = self.parse_string_literal()?;
self.expect_semicolon()?;
Ok(Statement::ImportDeclaration(ImportDeclaration {
specifiers,
source,
}))
}
fn parse_export_declaration(&mut self) -> Result<Statement> {
self.advance();
let token = self.current_token().clone();
let declaration = match token {
Token::Keyword(crate::lexer::Keyword::Class) => self.parse_class_declaration()?,
Token::Keyword(crate::lexer::Keyword::Interface) => {
self.parse_interface_declaration()?
}
Token::Keyword(crate::lexer::Keyword::Function) => self.parse_function_declaration()?,
Token::Keyword(crate::lexer::Keyword::Const) => self.parse_variable_declaration()?,
Token::Keyword(crate::lexer::Keyword::Let) => self.parse_variable_declaration()?,
Token::Keyword(crate::lexer::Keyword::Var) => self.parse_variable_declaration()?,
Token::Keyword(crate::lexer::Keyword::Enum) => self.parse_enum_declaration()?,
Token::Keyword(crate::lexer::Keyword::Type) => {
if self.position + 1 < self.tokens.len() {
if let Token::LeftBrace = &self.tokens[self.position + 1] {
self.parse_export_type_statement()?
} else {
self.parse_type_alias()?
}
} else {
self.parse_type_alias()?
}
},
Token::LeftBrace => {
self.parse_export_statement()?
},
_ => {
return Err(CompilerError::parse_error(
1,
1,
format!("Unexpected token in export declaration: {:?}", token),
))
}
};
Ok(Statement::ExportDeclaration(Box::new(ExportDeclaration {
declaration: Box::new(declaration),
})))
}
fn parse_export_statement(&mut self) -> Result<Statement> {
self.expect_token(&Token::LeftBrace)?;
let mut exports = Vec::new();
while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
let name = self.expect_identifier()?;
exports.push(name);
if self.current_token() == &Token::Comma {
self.advance(); }
}
self.expect_token(&Token::RightBrace)?; self.expect_semicolon()?;
Ok(Statement::ExportDeclaration(Box::new(ExportDeclaration {
declaration: Box::new(Statement::ExpressionStatement(ExpressionStatement {
expression: Expression::Literal(Literal::String(format!("Export: {}", exports.join(", ")))),
})),
})))
}
fn parse_export_type_statement(&mut self) -> Result<Statement> {
self.expect_keyword()?; self.expect_token(&Token::LeftBrace)?;
let mut type_names = Vec::new();
while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
let name = self.expect_identifier()?;
type_names.push(name);
if self.current_token() == &Token::Comma {
self.advance();
}
}
self.expect_token(&Token::RightBrace)?; self.expect_semicolon()?;
Ok(Statement::ExportDeclaration(Box::new(ExportDeclaration {
declaration: Box::new(Statement::TypeAlias(TypeAlias {
name: "exported_types".to_string(),
type_parameters: Vec::new(),
type_definition: Type::Any,
})),
})))
}
fn parse_namespace_declaration(&mut self) -> Result<Statement> {
self.expect_keyword()?; let name = self.expect_identifier()?;
let body = self.parse_block_statement()?;
Ok(Statement::NamespaceDeclaration(NamespaceDeclaration {
name,
body: Box::new(body),
}))
}
fn parse_module_declaration(&mut self) -> Result<Statement> {
self.expect_keyword()?; let name = self.parse_string_literal()?;
let body = self.parse_block_statement()?;
Ok(Statement::ModuleDeclaration(ModuleDeclaration {
name,
body: Box::new(body),
}))
}
fn parse_declare_statement(&mut self) -> Result<Statement> {
self.expect_keyword()?; let declaration = self.parse_statement()?;
Ok(Statement::DeclareStatement(Box::new(DeclareStatement {
declaration: Box::new(declaration.unwrap()),
})))
}
fn parse_return_statement(&mut self) -> Result<Statement> {
self.expect_keyword()?;
let argument = if self.current_token() == &Token::Semicolon {
None
} else {
Some(self.parse_expression()?)
};
if self.current_token() == &Token::Semicolon {
self.advance();
}
Ok(Statement::ReturnStatement(ReturnStatement { argument }))
}
fn parse_throw_statement(&mut self) -> Result<Statement> {
self.expect_keyword()?;
let argument = self.parse_expression()?;
if self.current_token() == &Token::Semicolon {
self.advance();
}
Ok(Statement::ThrowStatement(ThrowStatement { argument }))
}
fn parse_expression_statement(&mut self) -> Result<Statement> {
let expression = self.parse_expression()?;
self.expect_semicolon()?;
Ok(Statement::ExpressionStatement(ExpressionStatement {
expression,
}))
}
fn parse_block_statement(&mut self) -> Result<Statement> {
self.expect_token(&Token::LeftBrace)?;
let mut statements = Vec::new();
while self.current_token() != &Token::RightBrace {
if let Some(statement) = self.parse_statement()? {
statements.push(statement);
} else {
break;
}
}
self.expect_token(&Token::RightBrace)?;
Ok(Statement::BlockStatement(BlockStatement { statements }))
}
fn parse_expression(&mut self) -> Result<Expression> {
self.parse_assignment_expression()
}
fn parse_assignment_expression(&mut self) -> Result<Expression> {
let left = self.parse_conditional_expression()?;
if self.is_assignment_operator() {
let operator = self.current_token().clone();
self.advance();
let right = self.parse_assignment_expression()?;
Ok(Expression::Assignment(AssignmentExpression {
left: Box::new(left),
operator,
right: Box::new(right),
}))
} else {
Ok(left)
}
}
fn parse_conditional_expression(&mut self) -> Result<Expression> {
let test = self.parse_logical_or_expression()?;
if self.current_token() == &Token::QuestionMark {
self.advance();
let consequent = self.parse_expression()?;
self.expect_token(&Token::Colon)?;
let alternate = self.parse_expression()?;
Ok(Expression::Conditional(ConditionalExpression {
test: Box::new(test),
consequent: Box::new(consequent),
alternate: Box::new(alternate),
}))
} else {
Ok(test)
}
}
fn parse_logical_or_expression(&mut self) -> Result<Expression> {
let mut left = self.parse_logical_and_expression()?;
while self.current_token() == &Token::Or {
self.advance();
let right = self.parse_logical_and_expression()?;
left = Expression::Logical(LogicalExpression {
left: Box::new(left),
operator: Token::Or,
right: Box::new(right),
});
}
Ok(left)
}
fn parse_logical_and_expression(&mut self) -> Result<Expression> {
let mut left = self.parse_equality_expression()?;
while self.current_token() == &Token::And {
self.advance();
let right = self.parse_equality_expression()?;
left = Expression::Logical(LogicalExpression {
left: Box::new(left),
operator: Token::And,
right: Box::new(right),
});
}
Ok(left)
}
fn parse_equality_expression(&mut self) -> Result<Expression> {
let mut left = self.parse_relational_expression()?;
while self.is_equality_operator() {
let operator = self.current_token().clone();
self.advance();
let right = self.parse_relational_expression()?;
left = Expression::Binary(BinaryExpression {
left: Box::new(left),
operator,
right: Box::new(right),
});
}
Ok(left)
}
fn parse_relational_expression(&mut self) -> Result<Expression> {
let mut left = self.parse_additive_expression()?;
while self.is_relational_operator() {
let operator = self.current_token().clone();
self.advance();
let right = self.parse_additive_expression()?;
left = Expression::Binary(BinaryExpression {
left: Box::new(left),
operator,
right: Box::new(right),
});
}
Ok(left)
}
fn parse_additive_expression(&mut self) -> Result<Expression> {
let mut left = self.parse_multiplicative_expression()?;
while self.is_additive_operator() {
let operator = self.current_token().clone();
self.advance();
let right = self.parse_multiplicative_expression()?;
left = Expression::Binary(BinaryExpression {
left: Box::new(left),
operator,
right: Box::new(right),
});
}
Ok(left)
}
fn parse_multiplicative_expression(&mut self) -> Result<Expression> {
let mut left = self.parse_unary_expression()?;
while self.is_multiplicative_operator() {
let operator = self.current_token().clone();
self.advance();
let right = self.parse_unary_expression()?;
left = Expression::Binary(BinaryExpression {
left: Box::new(left),
operator,
right: Box::new(right),
});
}
Ok(left)
}
fn parse_unary_expression(&mut self) -> Result<Expression> {
if self.is_unary_operator() {
let operator = self.current_token().clone();
self.advance();
let argument = self.parse_unary_expression()?;
Ok(Expression::Unary(UnaryExpression {
operator,
argument: Box::new(argument),
}))
} else {
self.parse_postfix_expression()
}
}
fn parse_postfix_expression(&mut self) -> Result<Expression> {
let mut left = self.parse_primary_expression()?;
while self.is_postfix_operator() {
match self.current_token() {
Token::LeftParen => {
self.advance();
let arguments = self.parse_arguments()?;
self.expect_token(&Token::RightParen)?;
left = Expression::Call(CallExpression {
callee: Box::new(left),
arguments,
});
}
Token::LeftBracket => {
self.advance();
let index = self.parse_expression()?;
self.expect_token(&Token::RightBracket)?;
left = Expression::Member(MemberExpression {
object: Box::new(left),
property: Box::new(index),
computed: true,
});
}
Token::Dot => {
self.advance();
let property = self.expect_identifier()?;
left = Expression::Member(MemberExpression {
object: Box::new(left),
property: Box::new(Expression::Identifier(property)),
computed: false,
});
}
_ => break,
}
}
Ok(left)
}
fn parse_primary_expression(&mut self) -> Result<Expression> {
let token = self.current_token().clone();
match token {
Token::Number(n) => {
self.advance();
Ok(Expression::Literal(Literal::Number(n)))
}
Token::String(s) => {
self.advance();
Ok(Expression::Literal(Literal::String(s)))
}
Token::RegExp(pattern, flags) => {
self.advance();
Ok(Expression::Literal(Literal::RegExp(pattern.clone(), flags.clone())))
}
Token::TemplateLiteral(s) => {
self.advance();
let template = TemplateLiteral {
quasis: vec![TemplateElement {
value: s,
tail: true,
}],
expressions: vec![],
};
Ok(Expression::Template(template))
}
Token::Boolean(b) => {
self.advance();
Ok(Expression::Literal(Literal::Boolean(b)))
}
Token::Null => {
self.advance();
Ok(Expression::Literal(Literal::Null))
}
Token::Undefined => {
self.advance();
Ok(Expression::Literal(Literal::Undefined))
}
Token::Keyword(crate::lexer::Keyword::Null) => {
self.advance();
Ok(Expression::Literal(Literal::Null))
}
Token::Keyword(crate::lexer::Keyword::Undefined) => {
self.advance();
Ok(Expression::Literal(Literal::Undefined))
}
Token::Identifier(name) => {
self.advance();
Ok(Expression::Identifier(name))
}
Token::Keyword(crate::lexer::Keyword::This) => {
self.advance();
if self.current_token() == &Token::Dot {
self.advance(); let property = self.expect_identifier()?;
Ok(Expression::Member(MemberExpression {
object: Box::new(Expression::This(ThisExpression)),
property: Box::new(Expression::Identifier(property)),
computed: false,
}))
} else {
Ok(Expression::This(ThisExpression))
}
}
Token::Keyword(crate::lexer::Keyword::Super) => {
self.advance();
Ok(Expression::Super(SuperExpression))
}
Token::Keyword(crate::lexer::Keyword::New) => {
self.advance();
let callee = self.parse_primary_expression()?;
let arguments = if self.current_token() == &Token::LeftParen {
self.advance(); let args = self.parse_arguments()?;
self.expect_token(&Token::RightParen)?;
args
} else {
Vec::new()
};
Ok(Expression::New(NewExpression {
callee: Box::new(callee),
arguments,
}))
}
Token::LeftParen => {
let mut pos = self.position + 1;
let mut paren_count = 1;
while pos < self.tokens.len() && paren_count > 0 {
match &self.tokens[pos] {
Token::LeftParen => paren_count += 1,
Token::RightParen => paren_count -= 1,
_ => {}
}
pos += 1;
}
if pos < self.tokens.len() && self.tokens[pos] == Token::Arrow {
self.advance(); let parameters = self.parse_parameter_list()?;
self.expect_token(&Token::RightParen)?;
self.expect_token(&Token::Arrow)?;
let body = if self.current_token() == &Token::LeftBrace {
self.parse_block_statement()?
} else {
let expr = self.parse_expression()?;
Statement::ExpressionStatement(ExpressionStatement {
expression: expr,
})
};
Ok(Expression::Arrow(Box::new(ArrowFunctionExpression {
type_parameters: Vec::new(),
parameters,
return_type: None,
body: Box::new(body),
})))
} else {
self.advance();
let expression = self.parse_expression()?;
self.expect_token(&Token::RightParen)?;
Ok(Expression::Parenthesized(ParenthesizedExpression {
expression: Box::new(expression),
}))
}
}
Token::LeftBrace => self.parse_object_expression(),
Token::LeftBracket => self.parse_array_expression(),
_ => Err(CompilerError::parse_error(
self.position,
0,
format!("Unexpected token: {:?}", self.current_token()),
)),
}
}
fn parse_object_expression(&mut self) -> Result<Expression> {
self.expect_token(&Token::LeftBrace)?;
let mut properties = Vec::new();
while self.current_token() != &Token::RightBrace {
let key = self.parse_property_key()?;
let value = if self.current_token() == &Token::Colon {
self.advance();
self.parse_expression()?
} else {
key.clone()
};
properties.push(ObjectProperty {
key,
value,
shorthand: false,
computed: false,
method: false,
});
if self.current_token() == &Token::Comma {
self.advance();
}
}
self.expect_token(&Token::RightBrace)?;
Ok(Expression::Object(ObjectExpression { properties }))
}
fn parse_array_expression(&mut self) -> Result<Expression> {
self.expect_token(&Token::LeftBracket)?;
let mut elements = Vec::new();
while self.current_token() != &Token::RightBracket {
if self.current_token() == &Token::Comma {
self.advance();
elements.push(None);
} else {
elements.push(Some(self.parse_expression()?));
if self.current_token() == &Token::Comma {
self.advance();
}
}
}
self.expect_token(&Token::RightBracket)?;
Ok(Expression::Array(ArrayExpression { elements }))
}
fn parse_type(&mut self) -> Result<Type> {
let mut left_type = self.parse_primary_type()?;
while matches!(self.current_token(), Token::Union | Token::Intersection) {
let operator = self.current_token().clone();
self.advance();
let right_type = self.parse_primary_type()?;
left_type = match operator {
Token::Union => Type::Union {
left: Box::new(left_type),
right: Box::new(right_type),
},
Token::Intersection => Type::Intersection {
left: Box::new(left_type),
right: Box::new(right_type),
},
_ => return Err(CompilerError::parse_error(
1,
1,
"Expected union or intersection operator",
)),
};
}
while self.current_token() == &Token::LeftBracket {
self.advance(); self.expect_token(&Token::RightBracket)?; left_type = Type::Array(Box::new(left_type));
}
Ok(left_type)
}
fn parse_primary_type(&mut self) -> Result<Type> {
let token = self.current_token().clone();
match token {
Token::Keyword(crate::lexer::Keyword::String) => {
self.advance();
Ok(Type::String)
}
Token::Keyword(crate::lexer::Keyword::Number) => {
self.advance();
Ok(Type::Number)
}
Token::Keyword(crate::lexer::Keyword::Boolean) => {
self.advance();
Ok(Type::Boolean)
}
Token::Keyword(crate::lexer::Keyword::Any) => {
self.advance();
Ok(Type::Any)
}
Token::Keyword(crate::lexer::Keyword::Void) => {
self.advance();
Ok(Type::Void)
}
Token::Keyword(crate::lexer::Keyword::Never) => {
self.advance();
Ok(Type::Never)
}
Token::Keyword(crate::lexer::Keyword::Unknown) => {
self.advance();
Ok(Type::Unknown)
}
Token::Keyword(crate::lexer::Keyword::Array) => {
self.advance();
if self.current_token() == &Token::LessThan {
self.advance(); let element_type = self.parse_primary_type()?;
self.expect_token(&Token::GreaterThan)?;
Ok(Type::Array(Box::new(element_type)))
} else {
Ok(Type::Array(Box::new(Type::Any)))
}
}
Token::Keyword(crate::lexer::Keyword::Readonly) => {
self.advance();
let element_type = self.parse_primary_type()?;
Ok(element_type)
}
Token::Keyword(crate::lexer::Keyword::Keyof) => {
self.advance();
let _target_type = self.parse_type()?;
Ok(Type::String)
}
Token::Keyword(crate::lexer::Keyword::Key) => {
self.advance();
Ok(Type::String) }
Token::Keyword(crate::lexer::Keyword::Infer) => {
self.advance();
Ok(Type::Any) }
Token::Keyword(crate::lexer::Keyword::Null) => {
self.advance();
Ok(Type::Null) }
Token::Keyword(crate::lexer::Keyword::Undefined) => {
self.advance();
Ok(Type::Undefined) }
Token::Null => {
self.advance();
Ok(Type::Null)
}
Token::Undefined => {
self.advance();
Ok(Type::Undefined)
}
Token::Identifier(name) => {
let base_type = if self.current_token() == &Token::LessThan {
self.advance(); let mut type_args = Vec::new();
while self.current_token() != &Token::GreaterThan && self.current_token() != &Token::EOF {
let arg = self.parse_type()?;
type_args.push(arg);
if self.current_token() == &Token::Comma {
self.advance(); } else {
break;
}
}
self.expect_token(&Token::GreaterThan)?;
self.advance(); Type::GenericNamed {
name: name.to_string(),
type_arguments: type_args,
}
} else {
self.advance(); Type::Named(name.to_string())
};
if self.current_token() == &Token::LeftBracket {
self.advance(); self.expect_token(&Token::RightBracket)?; Ok(Type::Array(Box::new(base_type)))
} else {
Ok(base_type)
}
}
Token::String(s) => {
self.advance();
Ok(Type::Named(format!("\"{}\"", s)))
}
Token::Number(n) => {
self.advance();
Ok(Type::Named(n.to_string()))
}
Token::LeftParen => {
self.advance();
let type_ = self.parse_type()?;
self.expect_token(&Token::RightParen)?;
Ok(type_)
}
Token::LeftBrace => {
self.advance(); let mut members = Vec::new();
while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
if self.current_token() == &Token::LeftBracket {
let mut pos = self.position + 1; let mut is_mapped_type = false;
while pos < self.tokens.len() && self.tokens[pos] != Token::RightBracket {
if self.tokens[pos] == Token::Keyword(Keyword::In) {
is_mapped_type = true;
break;
}
pos += 1;
}
if is_mapped_type {
let mapped_type = self.parse_mapped_type()?;
members.push(ObjectTypeMember::Property(PropertySignature {
name: mapped_type.type_parameter.name.clone(),
optional: false,
type_: Some(*mapped_type.type_.clone()),
readonly: mapped_type.readonly.unwrap_or(false),
}));
continue;
} else {
let index_sig = self.parse_index_signature()?;
members.push(ObjectTypeMember::Index(index_sig));
if self.current_token() == &Token::Semicolon {
self.advance();
}
continue;
}
} else {
let readonly = if self.current_token() == &Token::Keyword(Keyword::Readonly) {
self.advance(); true
} else {
false
};
let name = self.expect_identifier()?;
let optional = if self.current_token() == &Token::QuestionMark {
self.advance();
true
} else {
false
};
self.expect_token(&Token::Colon)?;
let type_ = self.parse_type()?;
members.push(ObjectTypeMember::Property(PropertySignature {
name,
optional,
type_: Some(type_),
readonly,
}));
}
if self.current_token() == &Token::Semicolon {
self.advance();
}
}
self.expect_token(&Token::RightBrace)?;
Ok(Type::ObjectType(ObjectType { members }))
}
_ => Err(CompilerError::parse_error(
self.position,
0,
format!("Unexpected token in type: {:?}", self.current_token()),
)),
}
}
fn current_token(&self) -> &Token {
&self.tokens[self.position]
}
fn advance(&mut self) {
if self.position < self.tokens.len() {
self.position += 1;
}
}
fn expect_token(&mut self, expected: &Token) -> Result<()> {
if self.current_token() == expected {
self.advance();
Ok(())
} else {
Err(CompilerError::parse_error(
self.position,
0,
format!("Expected {:?}, found {:?}", expected, self.current_token()),
))
}
}
fn expect_keyword(&mut self) -> Result<crate::lexer::Keyword> {
if let Token::Keyword(keyword) = self.current_token() {
let keyword = keyword.clone();
self.advance();
Ok(keyword)
} else {
Err(CompilerError::parse_error(
self.position,
0,
format!("Expected keyword, found {:?}", self.current_token()),
))
}
}
fn expect_identifier(&mut self) -> Result<String> {
if let Token::Identifier(name) = self.current_token() {
let name = name.clone();
self.advance();
Ok(name)
} else {
Err(CompilerError::parse_error(
self.position,
0,
format!("Expected identifier, found {:?}", self.current_token()),
))
}
}
fn expect_semicolon(&mut self) -> Result<()> {
self.expect_token(&Token::Semicolon)
}
fn parse_string_literal(&mut self) -> Result<String> {
if let Token::String(s) = self.current_token() {
let s = s.clone();
self.advance();
Ok(s)
} else {
Err(CompilerError::parse_error(
self.position,
0,
format!("Expected string literal, found {:?}", self.current_token()),
))
}
}
fn is_assignment_operator(&self) -> bool {
matches!(
self.current_token(),
Token::Assign
| Token::PlusAssign
| Token::MinusAssign
| Token::MultiplyAssign
| Token::DivideAssign
)
}
fn is_equality_operator(&self) -> bool {
matches!(
self.current_token(),
Token::Equal | Token::NotEqual | Token::StrictEqual | Token::StrictNotEqual
)
}
fn is_relational_operator(&self) -> bool {
matches!(
self.current_token(),
Token::LessThan | Token::GreaterThan | Token::LessEqual | Token::GreaterEqual
)
}
fn is_additive_operator(&self) -> bool {
matches!(self.current_token(), Token::Plus | Token::Minus)
}
fn is_multiplicative_operator(&self) -> bool {
matches!(
self.current_token(),
Token::Multiply | Token::Divide | Token::Modulo
)
}
fn is_unary_operator(&self) -> bool {
matches!(
self.current_token(),
Token::Plus | Token::Minus | Token::Not | Token::Keyword(crate::lexer::Keyword::Typeof)
)
}
fn is_postfix_operator(&self) -> bool {
matches!(
self.current_token(),
Token::LeftParen | Token::LeftBracket | Token::Dot
)
}
fn parse_type_parameters(&mut self) -> Result<Vec<TypeParameter>> {
if self.current_token() == &Token::LessThan {
self.advance();
let mut type_parameters = Vec::new();
while self.current_token() != &Token::GreaterThan && self.current_token() != &Token::EOF {
let name = self.expect_identifier()?;
let constraint =
if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Extends) {
self.advance();
Some(self.parse_type()?)
} else {
None
};
let default_type = if self.current_token() == &Token::Assign {
self.advance();
Some(self.parse_type()?)
} else {
None
};
type_parameters.push(TypeParameter {
name,
constraint: constraint.map(Box::new),
default: default_type.map(Box::new),
});
if self.current_token() == &Token::Comma {
self.advance();
} else {
break;
}
}
self.expect_token(&Token::GreaterThan)?;
Ok(type_parameters)
} else {
Ok(Vec::new())
}
}
fn parse_parameters(&mut self) -> Result<Vec<Parameter>> {
self.expect_token(&Token::LeftParen)?;
let mut parameters = Vec::new();
while self.current_token() != &Token::RightParen {
let mut _modifiers = Vec::new();
while let Token::Keyword(keyword) = self.current_token() {
match keyword {
crate::lexer::Keyword::Public |
crate::lexer::Keyword::Private |
crate::lexer::Keyword::Protected |
crate::lexer::Keyword::Readonly => {
_modifiers.push(keyword.clone());
self.advance();
}
_ => break,
}
}
let name = self.expect_identifier()?;
let optional = if self.current_token() == &Token::QuestionMark {
self.advance();
true
} else {
false
};
let type_annotation = if self.current_token() == &Token::Colon {
self.advance();
Some(self.parse_type()?)
} else {
None
};
let initializer = if self.current_token() == &Token::Assign {
self.advance();
Some(self.parse_expression()?)
} else {
None
};
parameters.push(Parameter {
name,
optional,
type_: type_annotation.map(Box::new),
initializer,
rest: false,
});
if self.current_token() == &Token::Comma {
self.advance();
}
}
self.expect_token(&Token::RightParen)?;
Ok(parameters)
}
fn parse_parameter_list(&mut self) -> Result<Vec<Parameter>> {
let mut parameters = Vec::new();
while self.current_token() != &Token::RightParen {
let mut _modifiers = Vec::new();
while let Token::Keyword(keyword) = self.current_token() {
match keyword {
crate::lexer::Keyword::Public |
crate::lexer::Keyword::Private |
crate::lexer::Keyword::Protected |
crate::lexer::Keyword::Readonly => {
_modifiers.push(keyword.clone());
self.advance();
}
_ => break,
}
}
let name = self.expect_identifier()?;
let optional = if self.current_token() == &Token::QuestionMark {
self.advance();
true
} else {
false
};
let type_annotation = if self.current_token() == &Token::Colon {
self.advance();
Some(self.parse_type()?)
} else {
None
};
let initializer = if self.current_token() == &Token::Assign {
self.advance();
Some(self.parse_expression()?)
} else {
None
};
parameters.push(Parameter {
name,
optional,
type_: type_annotation.map(Box::new),
initializer,
rest: false,
});
if self.current_token() == &Token::Comma {
self.advance();
}
}
Ok(parameters)
}
fn parse_implements(&mut self) -> Result<Vec<Type>> {
if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Implements) {
self.advance();
let mut types = Vec::new();
loop {
let type_ = self.parse_type()?;
types.push(type_);
if self.current_token() == &Token::Comma {
self.advance();
} else {
break;
}
}
Ok(types)
} else {
Ok(Vec::new())
}
}
fn parse_extends(&mut self) -> Result<Vec<Type>> {
let mut extends = Vec::new();
if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Extends) {
self.advance();
let type_ = self.parse_type()?;
extends.push(type_);
while self.current_token() == &Token::Comma {
self.advance(); let type_ = self.parse_type()?;
extends.push(type_);
}
}
Ok(extends)
}
fn parse_class_body(&mut self) -> Result<ClassBody> {
self.expect_token(&Token::LeftBrace)?;
let mut members = Vec::new();
while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
let member = self.parse_class_member()?;
members.push(member.clone());
if let ClassMember::Decorator(_) = &member {
continue;
}
}
self.expect_token(&Token::RightBrace)?;
Ok(ClassBody { members })
}
fn parse_interface_body(&mut self) -> Result<InterfaceBody> {
self.expect_token(&Token::LeftBrace)?;
let mut members = Vec::new();
while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
let member = self.parse_interface_member()?;
members.push(member);
}
self.expect_token(&Token::RightBrace)?;
Ok(InterfaceBody { members })
}
fn parse_enum_members(&mut self) -> Result<Vec<EnumMember>> {
self.expect_token(&Token::LeftBrace)?;
let mut members = Vec::new();
while self.current_token() != &Token::RightBrace && self.current_token() != &Token::EOF {
let member = self.parse_enum_member()?;
members.push(member);
if self.current_token() == &Token::Comma {
self.advance();
}
}
self.expect_token(&Token::RightBrace)?;
Ok(members)
}
fn parse_import_specifiers(&mut self) -> Result<Vec<ImportSpecifier>> {
let mut specifiers = Vec::new();
if self.current_token() == &Token::LeftBrace {
self.advance();
while self.current_token() != &Token::RightBrace {
let name = self.expect_identifier()?;
specifiers.push(ImportSpecifier::Named(NamedImportSpecifier {
imported: name.clone(),
name,
}));
if self.current_token() == &Token::Comma {
self.advance();
}
}
self.expect_token(&Token::RightBrace)?; } else {
let name = self.expect_identifier()?;
specifiers.push(ImportSpecifier::Default(DefaultImportSpecifier { name }));
}
Ok(specifiers)
}
fn parse_arguments(&mut self) -> Result<Vec<Expression>> {
let mut arguments = Vec::new();
while self.current_token() != &Token::RightParen {
let argument = self.parse_expression()?;
arguments.push(argument);
if self.current_token() == &Token::Comma {
self.advance();
} else if self.current_token() != &Token::RightParen {
return Err(CompilerError::parse_error(
1,
1,
"Expected comma or closing parenthesis".to_string(),
));
}
}
Ok(arguments)
}
fn parse_class_member(&mut self) -> Result<ClassMember> {
let mut modifiers = Vec::new();
let mut decorators = Vec::new();
while self.current_token() == &Token::At {
self.advance(); let decorator_name = self.expect_identifier()?;
decorators.push(decorator_name);
if self.current_token() == &Token::LeftParen {
self.advance(); let mut paren_count = 1;
while paren_count > 0 && self.position < self.tokens.len() {
match self.current_token() {
Token::LeftParen => paren_count += 1,
Token::RightParen => paren_count -= 1,
_ => {}
}
self.advance();
}
}
}
while let Token::Keyword(keyword) = self.current_token() {
match keyword {
crate::lexer::Keyword::Public => {
modifiers.push(crate::ast::Modifier::Public);
self.advance();
}
crate::lexer::Keyword::Private => {
modifiers.push(crate::ast::Modifier::Private);
self.advance();
}
crate::lexer::Keyword::Protected => {
modifiers.push(crate::ast::Modifier::Protected);
self.advance();
}
crate::lexer::Keyword::Readonly => {
modifiers.push(crate::ast::Modifier::Readonly);
self.advance();
}
crate::lexer::Keyword::Static => {
modifiers.push(crate::ast::Modifier::Static);
self.advance();
}
_ => break,
}
}
if !decorators.is_empty() && self.position >= self.tokens.len() - 1 {
return Ok(ClassMember::Decorator(decorators[0].clone()));
}
let token = self.current_token().clone();
match token {
Token::Keyword(crate::lexer::Keyword::Constructor) => {
self.advance();
let parameters = self.parse_parameters()?;
let body = self.parse_block_statement()?;
Ok(ClassMember::Constructor(ConstructorDeclaration {
parameters,
body: Some(body),
modifiers,
decorators: decorators.clone(),
}))
}
Token::Keyword(crate::lexer::Keyword::Get) => {
self.advance();
let name = if let Token::Identifier(name) = self.current_token() {
let name = name.clone();
self.advance();
name
} else {
return Err(CompilerError::parse_error(
1,
1,
"Expected getter name".to_string(),
));
};
if self.current_token() == &Token::LeftParen {
self.advance(); self.expect_token(&Token::RightParen)?; }
let return_type = if self.current_token() == &Token::Colon {
self.advance();
Some(self.parse_type()?)
} else {
None
};
let body = if self.current_token() == &Token::LeftBrace {
self.parse_block_statement()?
} else {
return Err(CompilerError::parse_error(
1,
1,
"Expected block statement for getter".to_string(),
));
};
Ok(ClassMember::Getter(GetterDeclaration {
name,
type_: return_type,
body: Some(body),
modifiers,
decorators,
}))
}
Token::Keyword(crate::lexer::Keyword::Set) => {
self.advance();
let name = if let Token::Identifier(name) = self.current_token() {
let name = name.clone();
self.advance();
name
} else {
return Err(CompilerError::parse_error(
1,
1,
"Expected setter name".to_string(),
));
};
let parameter = if self.current_token() == &Token::LeftParen {
self.advance(); let name = self.expect_identifier()?;
self.expect_token(&Token::Colon)?;
let type_annotation = self.parse_type()?;
self.expect_token(&Token::RightParen)?;
Parameter {
name,
optional: false,
type_: Some(Box::new(type_annotation)),
initializer: None,
rest: false,
}
} else {
return Err(CompilerError::parse_error(
1,
1,
"Expected setter parameter".to_string(),
));
};
let body = if self.current_token() == &Token::LeftBrace {
self.parse_block_statement()?
} else {
return Err(CompilerError::parse_error(
1,
1,
"Expected block statement for setter".to_string(),
));
};
Ok(ClassMember::Setter(SetterDeclaration {
name,
parameter,
body: Some(body),
modifiers,
decorators,
}))
}
Token::Identifier(name) => {
self.advance();
if name == "constructor" {
println!("DEBUG: parsing constructor");
let parameters = self.parse_parameters()?;
let body = self.parse_block_statement()?;
Ok(ClassMember::Constructor(ConstructorDeclaration {
parameters,
body: Some(body),
modifiers,
decorators: decorators.clone(),
}))
} else if self.current_token() == &Token::LeftParen {
let parameters = self.parse_parameters()?;
let return_type = if self.current_token() == &Token::Colon {
self.advance();
Some(self.parse_type()?)
} else {
None
};
let body = self.parse_block_statement()?;
Ok(ClassMember::Method(MethodDeclaration {
name,
optional: false,
type_parameters: Vec::new(),
parameters,
return_type,
body: Some(body),
modifiers,
decorators,
}))
} else if self.current_token() == &Token::Colon {
self.advance();
let type_annotation = self.parse_type()?;
let initializer = if self.current_token() == &Token::Assign {
self.advance();
Some(self.parse_expression()?)
} else {
None
};
self.expect_token(&Token::Semicolon)?;
Ok(ClassMember::Property(PropertyDeclaration {
name,
optional: false,
type_: Some(type_annotation),
initializer,
modifiers,
decorators,
}))
} else {
if name == "constructor" {
let parameters = self.parse_parameters()?;
let body = self.parse_block_statement()?;
Ok(ClassMember::Constructor(ConstructorDeclaration {
parameters,
body: Some(body),
modifiers: Vec::new(),
decorators: Vec::new(),
}))
} else {
self.advance();
Err(CompilerError::parse_error(
self.position - 1,
1,
"Unexpected class member, skipping token".to_string(),
))
}
}
}
_ => {
self.advance();
Err(CompilerError::parse_error(
self.position - 1,
1,
"Expected class member, skipping token".to_string(),
))
}
}
}
fn parse_interface_member(&mut self) -> Result<ObjectTypeMember> {
let mut readonly = false;
if let Token::Keyword(crate::lexer::Keyword::Readonly) = self.current_token() {
readonly = true;
self.advance();
if let Token::Keyword(crate::lexer::Keyword::Readonly) = self.current_token() {
let name = "readonly".to_string();
self.advance();
if self.current_token() == &Token::Colon {
self.advance();
let type_annotation = self.parse_type()?;
self.expect_token(&Token::Semicolon)?;
return Ok(ObjectTypeMember::Property(PropertySignature {
name,
optional: false,
type_: Some(type_annotation),
readonly,
}));
} else {
return Err(CompilerError::parse_error(
1, 1,
"Expected colon after property name".to_string(),
));
}
}
}
let token = self.current_token().clone();
match token {
Token::Identifier(_) => {
let name = if let Token::Identifier(name) = self.current_token() {
name.clone()
} else {
return Err(CompilerError::parse_error(
1, 1,
"Expected identifier for interface member".to_string(),
));
};
if self.position + 1 < self.tokens.len() && self.tokens[self.position + 1] == Token::LeftParen {
self.advance(); let parameters = self.parse_parameters()?;
let return_type = if self.current_token() == &Token::Colon {
self.advance();
Some(self.parse_type()?)
} else {
None
};
self.expect_token(&Token::Semicolon)?;
Ok(ObjectTypeMember::Method(MethodSignature {
name,
optional: false,
type_parameters: Vec::new(),
parameters,
return_type,
}))
} else {
self.advance(); let optional = if self.current_token() == &Token::QuestionMark {
self.advance();
true
} else {
false
};
self.expect_token(&Token::Colon)?;
let type_annotation = self.parse_type()?;
self.expect_token(&Token::Semicolon)?;
Ok(ObjectTypeMember::Property(PropertySignature {
name,
optional,
type_: Some(type_annotation),
readonly,
}))
}
}
Token::LeftParen => {
let parameters = self.parse_parameters()?;
let return_type = if self.current_token() == &Token::Colon {
self.advance();
Some(self.parse_type()?)
} else {
None
};
self.expect_token(&Token::Semicolon)?;
Ok(ObjectTypeMember::Method(MethodSignature {
name: "call".to_string(), optional: false,
type_parameters: Vec::new(),
parameters,
return_type,
}))
}
Token::Keyword(crate::lexer::Keyword::New) => {
self.advance(); let parameters = self.parse_parameters()?;
let return_type = if self.current_token() == &Token::Colon {
self.advance();
Some(self.parse_type()?)
} else {
None
};
self.expect_token(&Token::Semicolon)?;
Ok(ObjectTypeMember::Method(MethodSignature {
name: "constructor".to_string(), optional: false,
type_parameters: Vec::new(),
parameters,
return_type,
}))
}
Token::Keyword(crate::lexer::Keyword::Readonly) => {
let name = "readonly".to_string();
self.advance();
if self.current_token() == &Token::Colon {
self.advance();
let type_annotation = self.parse_type()?;
self.expect_token(&Token::Semicolon)?;
Ok(ObjectTypeMember::Property(PropertySignature {
name,
optional: false,
type_: Some(type_annotation),
readonly,
}))
} else {
Err(CompilerError::parse_error(
1, 1,
"Expected colon after property name".to_string(),
))
}
}
Token::LeftBracket => {
self.advance(); let key_name = match self.current_token() {
Token::Identifier(name) => {
let name = name.clone();
self.advance();
name
}
Token::Keyword(crate::lexer::Keyword::Key) => {
self.advance();
"key".to_string()
}
_ => return Err(CompilerError::parse_error(
1, 1,
"Expected identifier or 'key' in index signature".to_string(),
))
};
self.expect_token(&Token::Colon)?;
let key_type = self.parse_type()?;
self.expect_token(&Token::RightBracket)?;
self.expect_token(&Token::Colon)?;
let value_type = self.parse_type()?;
self.expect_token(&Token::Semicolon)?;
Ok(ObjectTypeMember::Index(IndexSignature {
parameter: Box::new(Parameter {
name: key_name,
type_: Some(Box::new(key_type)),
optional: false,
initializer: None,
rest: false,
}),
type_: value_type,
readonly: false,
}))
}
_ => Err(CompilerError::parse_error(
1,
1,
"Expected interface member".to_string(),
)),
}
}
fn parse_enum_member(&mut self) -> Result<EnumMember> {
let name = self.expect_identifier()?;
let initializer = if self.current_token() == &Token::Assign {
self.advance();
Some(self.parse_expression()?)
} else {
None
};
Ok(EnumMember { name, initializer })
}
fn parse_if_statement(&mut self) -> Result<Statement> {
self.expect_keyword()?;
self.expect_token(&Token::LeftParen)?;
let test = self.parse_expression()?;
self.expect_token(&Token::RightParen)?;
let consequent = self.parse_statement()?.unwrap();
let alternate = if self.current_token() == &Token::Keyword(crate::lexer::Keyword::Else) {
self.advance();
Some(self.parse_statement()?.unwrap())
} else {
None
};
Ok(Statement::IfStatement(Box::new(IfStatement {
condition: test,
consequent: Box::new(consequent),
alternate,
})))
}
fn parse_property_key(&mut self) -> Result<Expression> {
self.parse_expression()
}
fn parse_index_signature(&mut self) -> Result<IndexSignature> {
self.expect_token(&Token::LeftBracket)?;
let key_name = match self.current_token() {
Token::Identifier(name) => {
let name = name.clone();
self.advance();
name
}
Token::Keyword(Keyword::Key) => {
self.advance();
"key".to_string()
}
_ => {
return Err(CompilerError::parse_error(
self.position,
0,
format!("Expected identifier or 'key', found {:?}", self.current_token()),
));
}
};
self.expect_token(&Token::Colon)?;
let key_type = self.parse_type()?;
self.expect_token(&Token::RightBracket)?;
self.expect_token(&Token::Colon)?;
let value_type = self.parse_type()?;
Ok(IndexSignature {
parameter: Box::new(Parameter {
name: key_name,
type_: Some(Box::new(key_type)),
optional: false,
initializer: None,
rest: false,
}),
type_: value_type,
readonly: false,
})
}
fn parse_mapped_type(&mut self) -> Result<MappedType> {
self.expect_token(&Token::LeftBracket)?;
let type_parameter_name = match self.current_token() {
Token::Identifier(name) => {
let name = name.clone();
self.advance();
name
}
Token::Keyword(Keyword::Key) => {
self.advance();
"Key".to_string()
}
_ => {
return Err(CompilerError::parse_error(
self.position,
0,
format!("Expected identifier or Key, found {:?}", self.current_token()),
));
}
};
let type_parameter = TypeParameter {
name: type_parameter_name.clone(),
constraint: None,
default: None,
};
if self.current_token() == &Token::Keyword(Keyword::In) {
self.advance();
} else {
return Err(CompilerError::parse_error(
self.position,
0,
format!("Expected 'in', found {:?}", self.current_token()),
));
}
let constraint_type = self.parse_type()?;
self.expect_token(&Token::RightBracket)?;
self.expect_token(&Token::Colon)?;
let value_type = self.parse_type()?;
if self.current_token() == &Token::Semicolon {
self.advance();
}
Ok(MappedType {
type_parameter: Box::new(type_parameter),
constraint: Some(Box::new(constraint_type)),
name_type: None,
type_: Box::new(value_type),
readonly: None,
optional: None,
})
}
}