mod assignment_parselet;
mod binary_parselet;
mod grouping_parselet;
mod literal_parselet;
mod logic_parselet;
mod unary_parselet;
mod value_parselet;
pub use assignment_parselet::AssignmentParselet;
pub use binary_parselet::{BinaryKind, BinaryParselet};
pub use grouping_parselet::GroupingParselet;
pub use literal_parselet::LiteralParselet;
pub use logic_parselet::{LogicKind, LogicParselet};
pub use unary_parselet::UnaryParselet;
pub use value_parselet::ValueParselet;
use crate::{
compilation::{CompilationError, Parser},
execution::Chunk,
};
use super::{Lexer, precedence::Precedence, token::Token};
pub trait PrefixParselet: Send + Sync {
fn parse(&self, lexer: &mut Lexer, parser: &mut Parser, chunk: &mut Chunk, token: Token)
-> Result<(), CompilationError>;
}
pub trait InfixParselet: Send + Sync {
fn parse(&self, lexer: &mut Lexer, parser: &mut Parser, chunk: &mut Chunk, token: Token)
-> Result<(), CompilationError>;
fn get_precedence(&self) -> Precedence;
}
#[derive(Clone)]
pub enum AnyPrefixParselet {
Assignment(AssignmentParselet),
Grouping(GroupingParselet),
Literal(LiteralParselet),
Unary(UnaryParselet),
Value(ValueParselet),
}
impl PrefixParselet for AnyPrefixParselet {
fn parse(&self, lexer: &mut Lexer, parser: &mut Parser, chunk: &mut Chunk, token: Token)
-> Result<(), CompilationError> {
match self {
Self::Assignment(p) => p.parse(lexer, parser, chunk, token),
Self::Grouping(p) => p.parse(lexer, parser, chunk, token),
Self::Literal(p) => p.parse(lexer, parser, chunk, token),
Self::Unary(p) => p.parse(lexer, parser, chunk, token),
Self::Value(p) => p.parse(lexer, parser, chunk, token),
}
}
}
#[derive(Clone)]
pub enum AnyInfixParselet {
Binary(BinaryParselet),
Logic(LogicParselet),
}
impl InfixParselet for AnyInfixParselet {
fn parse(&self, lexer: &mut Lexer, parser: &mut Parser, chunk: &mut Chunk, token: Token)
-> Result<(), CompilationError> {
match self {
Self::Binary(p) => p.parse(lexer, parser, chunk, token),
Self::Logic(p) => p.parse(lexer, parser, chunk, token),
}
}
fn get_precedence(&self) -> Precedence {
match self {
Self::Binary(p) => p.get_precedence(),
Self::Logic(p) => p.get_precedence(),
}
}
}