mirror of
https://github.com/exoticorn/curlywas.git
synced 2026-01-20 11:46:43 +01:00
improve compile times
This commit is contained in:
@@ -420,6 +420,7 @@ fn map_token<O>(
|
|||||||
|
|
||||||
fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clone {
|
fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clone {
|
||||||
recursive(|block| {
|
recursive(|block| {
|
||||||
|
let mut block_expression = None;
|
||||||
let expression = recursive(|expression| {
|
let expression = recursive(|expression| {
|
||||||
let val = map_token(|tok| match tok {
|
let val = map_token(|tok| match tok {
|
||||||
Token::Int(v) => Some(ast::Expr::I32Const(*v)),
|
Token::Int(v) => Some(ast::Expr::I32Const(*v)),
|
||||||
@@ -445,7 +446,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
.map(|(name, expr)| ast::Expr::LocalTee {
|
.map(|(name, expr)| ast::Expr::LocalTee {
|
||||||
name,
|
name,
|
||||||
value: Box::new(expr),
|
value: Box::new(expr),
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
let loop_expr = just(Token::Loop)
|
let loop_expr = just(Token::Loop)
|
||||||
.ignore_then(ident)
|
.ignore_then(ident)
|
||||||
@@ -459,6 +460,10 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
block: Box::new(block),
|
block: Box::new(block),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let block_expr = loop_expr.boxed();
|
||||||
|
|
||||||
|
block_expression = Some(block_expr.clone());
|
||||||
|
|
||||||
let branch_if = just(Token::BranchIf)
|
let branch_if = just(Token::BranchIf)
|
||||||
.ignore_then(expression.clone())
|
.ignore_then(expression.clone())
|
||||||
.then_ignore(just(Token::Ctrl(':')))
|
.then_ignore(just(Token::Ctrl(':')))
|
||||||
@@ -466,7 +471,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
.map(|(condition, label)| ast::Expr::BranchIf {
|
.map(|(condition, label)| ast::Expr::BranchIf {
|
||||||
condition: Box::new(condition),
|
condition: Box::new(condition),
|
||||||
label,
|
label,
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
let let_ = just(Token::Let)
|
let let_ = just(Token::Let)
|
||||||
.ignore_then(just(Token::Defer).or_not())
|
.ignore_then(just(Token::Defer).or_not())
|
||||||
@@ -482,7 +487,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
type_,
|
type_,
|
||||||
value: value.map(Box::new),
|
value: value.map(Box::new),
|
||||||
defer: defer.is_some(),
|
defer: defer.is_some(),
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
let tee = ident
|
let tee = ident
|
||||||
.clone()
|
.clone()
|
||||||
@@ -491,7 +496,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
.map(|(name, value)| ast::Expr::LocalTee {
|
.map(|(name, value)| ast::Expr::LocalTee {
|
||||||
name,
|
name,
|
||||||
value: Box::new(value),
|
value: Box::new(value),
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
let select = just(Token::Select)
|
let select = just(Token::Select)
|
||||||
.ignore_then(
|
.ignore_then(
|
||||||
@@ -507,7 +512,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
condition: Box::new(condition),
|
condition: Box::new(condition),
|
||||||
if_true: Box::new(if_true),
|
if_true: Box::new(if_true),
|
||||||
if_false: Box::new(if_false),
|
if_false: Box::new(if_false),
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
let function_call = ident
|
let function_call = ident
|
||||||
.clone()
|
.clone()
|
||||||
@@ -517,14 +522,14 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
.separated_by(just(Token::Ctrl(',')))
|
.separated_by(just(Token::Ctrl(',')))
|
||||||
.delimited_by(Token::Ctrl('('), Token::Ctrl(')')),
|
.delimited_by(Token::Ctrl('('), Token::Ctrl(')')),
|
||||||
)
|
)
|
||||||
.map(|(name, params)| ast::Expr::FuncCall { name, params });
|
.map(|(name, params)| ast::Expr::FuncCall { name, params }).boxed();
|
||||||
|
|
||||||
let atom = val
|
let atom = val
|
||||||
.or(tee)
|
.or(tee)
|
||||||
.or(function_call)
|
.or(function_call)
|
||||||
.or(variable)
|
.or(variable)
|
||||||
.or(local_tee)
|
.or(local_tee)
|
||||||
.or(loop_expr)
|
.or(block_expr)
|
||||||
.or(branch_if)
|
.or(branch_if)
|
||||||
.or(let_)
|
.or(let_)
|
||||||
.or(select)
|
.or(select)
|
||||||
@@ -537,7 +542,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
Token::Ctrl(')'),
|
Token::Ctrl(')'),
|
||||||
[(Token::Ctrl('{'), Token::Ctrl('}'))],
|
[(Token::Ctrl('{'), Token::Ctrl('}'))],
|
||||||
|span| ast::Expr::Error.with_span(span),
|
|span| ast::Expr::Error.with_span(span),
|
||||||
));
|
)).boxed();
|
||||||
|
|
||||||
let unary_op = just(Token::Op("-".to_string()))
|
let unary_op = just(Token::Op("-".to_string()))
|
||||||
.to(ast::UnaryOp::Negate)
|
.to(ast::UnaryOp::Negate)
|
||||||
@@ -553,7 +558,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
}
|
}
|
||||||
.with_span(span)
|
.with_span(span)
|
||||||
})
|
})
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
let op_cast = unary_op
|
let op_cast = unary_op
|
||||||
.clone()
|
.clone()
|
||||||
@@ -569,7 +574,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
type_,
|
type_,
|
||||||
}
|
}
|
||||||
.with_span(span)
|
.with_span(span)
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
let mem_size = just(Token::Ctrl('?'))
|
let mem_size = just(Token::Ctrl('?'))
|
||||||
.to(ast::MemSize::Byte)
|
.to(ast::MemSize::Byte)
|
||||||
@@ -596,7 +601,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
value: Box::new(value),
|
value: Box::new(value),
|
||||||
}
|
}
|
||||||
.with_span(span)
|
.with_span(span)
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
let op_product = memory_op
|
let op_product = memory_op
|
||||||
.clone()
|
.clone()
|
||||||
@@ -616,7 +621,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
right: Box::new(right),
|
right: Box::new(right),
|
||||||
}
|
}
|
||||||
.with_span(span)
|
.with_span(span)
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
let op_sum = op_product
|
let op_sum = op_product
|
||||||
.clone()
|
.clone()
|
||||||
@@ -635,7 +640,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
right: Box::new(right),
|
right: Box::new(right),
|
||||||
}
|
}
|
||||||
.with_span(span)
|
.with_span(span)
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
let op_cmp = op_sum
|
let op_cmp = op_sum
|
||||||
.clone()
|
.clone()
|
||||||
@@ -658,7 +663,7 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
right: Box::new(right),
|
right: Box::new(right),
|
||||||
}
|
}
|
||||||
.with_span(span)
|
.with_span(span)
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
let op_bit = op_cmp
|
let op_bit = op_cmp
|
||||||
.clone()
|
.clone()
|
||||||
@@ -678,14 +683,17 @@ fn block_parser() -> impl Parser<Token, ast::Block, Error = Simple<Token>> + Clo
|
|||||||
right: Box::new(right),
|
right: Box::new(right),
|
||||||
}
|
}
|
||||||
.with_span(span)
|
.with_span(span)
|
||||||
});
|
}).boxed();
|
||||||
|
|
||||||
op_bit
|
op_bit
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let block_expression = block_expression.unwrap();
|
||||||
|
|
||||||
expression
|
expression
|
||||||
.clone()
|
.clone()
|
||||||
.then_ignore(just(Token::Ctrl(';')))
|
.then_ignore(just(Token::Ctrl(';')))
|
||||||
|
.or(block_expression.map_with_span(|expr, span| expr.with_span(span)))
|
||||||
.repeated()
|
.repeated()
|
||||||
.then(expression.clone().or_not())
|
.then(expression.clone().or_not())
|
||||||
.map(|(statements, final_expression)| ast::Block {
|
.map(|(statements, final_expression)| ast::Block {
|
||||||
|
|||||||
Reference in New Issue
Block a user