258 lines
5.9 KiB
Plaintext
258 lines
5.9 KiB
Plaintext
================================================================================
|
|
Macro invocation - no arguments
|
|
================================================================================
|
|
|
|
a!();
|
|
b![];
|
|
c!{};
|
|
d::e!();
|
|
f::g::h!{};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree)))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree)))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree)))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(scoped_identifier
|
|
(identifier)
|
|
(identifier))
|
|
(token_tree)))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(scoped_identifier
|
|
(scoped_identifier
|
|
(identifier)
|
|
(identifier))
|
|
(identifier))
|
|
(token_tree))))
|
|
|
|
================================================================================
|
|
Macro invocation - arbitrary tokens
|
|
================================================================================
|
|
|
|
a!(* a *);
|
|
a!(& a &);
|
|
a!(- a -);
|
|
a!(b + c + +);
|
|
a!('a'..='z');
|
|
a!('\u{0}'..='\u{2}');
|
|
a!('lifetime)
|
|
default!(a);
|
|
union!(a);
|
|
a!($);
|
|
a!($());
|
|
a!($ a $);
|
|
a!(${$([ a ])});
|
|
a!($a $a:ident $($a);*);
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree
|
|
(identifier))))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree
|
|
(identifier))))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree
|
|
(identifier))))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree
|
|
(identifier)
|
|
(identifier))))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree
|
|
(char_literal)
|
|
(char_literal))))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree
|
|
(char_literal)
|
|
(char_literal))))
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree
|
|
(identifier)))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree
|
|
(identifier))))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree
|
|
(identifier))))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree)))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree (token_tree))))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree (identifier))))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree (token_tree (token_tree (token_tree (identifier)))))))
|
|
(expression_statement
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree
|
|
(identifier)
|
|
(identifier)
|
|
(identifier)
|
|
(token_tree
|
|
(identifier))))))
|
|
|
|
================================================================================
|
|
Macro invocation with comments
|
|
================================================================================
|
|
|
|
ok! {
|
|
// one
|
|
/* two */
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree
|
|
(line_comment)
|
|
(block_comment))))
|
|
|
|
================================================================================
|
|
Macro definition
|
|
================================================================================
|
|
|
|
macro_rules! say_hello {
|
|
() => (
|
|
println!("Hello!");
|
|
)
|
|
}
|
|
|
|
macro_rules! four {
|
|
() => {1 + 3};
|
|
}
|
|
|
|
macro_rules! foo {
|
|
(x => $e:expr) => (println!("mode X: {}", $e));
|
|
(y => $e:expr) => (println!("mode Y: {}", $e))
|
|
}
|
|
|
|
macro_rules! o_O {
|
|
(
|
|
$($x:expr; [ $( $y:expr ),* ]);*
|
|
) => {
|
|
$($($x + $e),*),*
|
|
}
|
|
}
|
|
|
|
macro_rules! zero_or_one {
|
|
($($e:expr),?) => {
|
|
$($e),?
|
|
};
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(macro_definition
|
|
name: (identifier)
|
|
(macro_rule
|
|
left: (token_tree_pattern)
|
|
right: (token_tree
|
|
(identifier)
|
|
(token_tree
|
|
(string_literal)))))
|
|
(macro_definition
|
|
name: (identifier)
|
|
(macro_rule
|
|
left: (token_tree_pattern)
|
|
right: (token_tree
|
|
(integer_literal)
|
|
(integer_literal))))
|
|
(macro_definition
|
|
name: (identifier)
|
|
(macro_rule
|
|
left: (token_tree_pattern
|
|
(identifier)
|
|
(token_binding_pattern
|
|
name: (metavariable)
|
|
type: (fragment_specifier)))
|
|
right: (token_tree
|
|
(identifier)
|
|
(token_tree
|
|
(string_literal)
|
|
(metavariable))))
|
|
(macro_rule
|
|
left: (token_tree_pattern
|
|
(identifier)
|
|
(token_binding_pattern
|
|
name: (metavariable)
|
|
type: (fragment_specifier)))
|
|
right: (token_tree
|
|
(identifier)
|
|
(token_tree
|
|
(string_literal)
|
|
(metavariable)))))
|
|
(macro_definition
|
|
name: (identifier)
|
|
(macro_rule
|
|
left: (token_tree_pattern
|
|
(token_repetition_pattern
|
|
(token_binding_pattern
|
|
name: (metavariable)
|
|
type: (fragment_specifier))
|
|
(token_tree_pattern
|
|
(token_repetition_pattern
|
|
(token_binding_pattern
|
|
name: (metavariable)
|
|
type: (fragment_specifier))))))
|
|
right: (token_tree
|
|
(token_repetition
|
|
(token_repetition
|
|
(metavariable)
|
|
(metavariable))))))
|
|
(macro_definition
|
|
name: (identifier)
|
|
(macro_rule
|
|
left: (token_tree_pattern
|
|
(token_repetition_pattern
|
|
(token_binding_pattern
|
|
name: (metavariable)
|
|
type: (fragment_specifier))))
|
|
right: (token_tree
|
|
(token_repetition
|
|
(metavariable))))))
|