#[macro_export]
macro_rules! token {
($self:expr, $token:expr) => {
crate::lexer::Token {
line: $self.line,
line_start: $self.line_start,
column: $self.column,
start: $self.start,
end: $self.current,
token_type: $token,
}
};
}
#[macro_export]
macro_rules! token_display {
( $match_to:expr, $f:expr, $( $name:tt),*) => {
match $match_to {
$( $name => { $f.write_str(stringify!($name))?; } ),*
_ => ()
}
}
}
#[macro_export]
macro_rules! lit {
($type:ident, $data:expr, $token:expr) => {
$crate::parser::AST {
ast_type: $crate::parser::ASTType::Lit($crate::parser::Lit::$type($data)),
line_start: $token.line_start,
start: $token.start,
end: $token.end,
line: $token.line,
column: $token.column,
}
};
}
#[macro_export]
macro_rules! ast {
($ast_type:expr, $start:expr, $end:expr) => {
AST {
ast_type: $ast_type,
line_start: $start.line_start,
start: $start.start,
end: $end.end,
line: $start.line,
column: $start.column,
}
};
}
#[macro_export]
macro_rules! name {
($name:expr, $token:expr) => {
Name {
name: $name,
line_start: $token.line_start,
end: $token.end,
line: $token.line,
column: $token.column,
}
};
}
#[macro_export]
macro_rules! push_output {
( $match_to:expr, $output:expr, $( $name:tt),*) => {
match $match_to {
$( $name => { $output += stringify!($name); } ),*
}
}
}
#[macro_export]
macro_rules! unexpected_token {
($self:expr, $message:expr, $token:expr) => {
$crate::error::KabelError::new(
$crate::error::ErrorKind::UnexpectedToken,
format!($message, $self.text[$token.start..$token.end].to_string()),
$token.line,
$token.column,
$self.text[$token.line_start..$token.end].to_string(),
)
};
}
#[macro_export]
macro_rules! out_of_scope {
($self:expr, $message:expr, $name:expr, $expr:expr) => {
$crate::error::KabelError::new(
$crate::error::ErrorKind::OutOfScope,
format!($message, $name),
$expr.line,
$expr.column,
$self.text[$expr.line_start..$expr.end].to_string(),
)
};
}
#[macro_export]
macro_rules! out_of_scope_var {
($self:expr, $message:expr, $name:expr, $expr:expr) => {
$crate::error::KabelError::new(
$crate::error::ErrorKind::OutOfScope,
format!($message, $name.name),
$expr.line,
$name.column,
$self.text[$expr.line_start..$expr.end].to_string(),
)
};
}