#[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(), ) }; }