pub fn fn_macro_declaration(input: &[Token]) -> CResult<'_, (&[u8], Vec<&[u8]>)>
Expand description
Parse a functional macro declaration from a list of tokens.
Returns the identifier for the macro and the argument list (in order). The
input should not include #define
. The actual definition is not parsed and
may be obtained from the unparsed data returned.
Returns an error if the input is not a functional macro or if the token stream contains comments.
ยงExample
use cexpr::expr::{IdentifierParser, EvalResult, fn_macro_declaration};
use cexpr::assert_full_parse;
use cexpr::token::Kind::*;
use cexpr::token::Token;
// #define SUFFIX(arg) arg "suffix"
let tokens = vec![
(Identifier, &b"SUFFIX"[..]).into(),
(Punctuation, &b"("[..]).into(),
(Identifier, &b"arg"[..]).into(),
(Punctuation, &b")"[..]).into(),
(Identifier, &b"arg"[..]).into(),
(Literal, &br#""suffix""#[..]).into(),
];
// Try to parse the functional part
let (expr, (ident, args)) = fn_macro_declaration(&tokens).unwrap();
assert_eq!(ident, b"SUFFIX");
// Create dummy arguments
let idents = args.into_iter().map(|arg|
(arg.to_owned(), EvalResult::Str(b"test".to_vec()))
).collect();
// Evaluate the macro
let (_, evaluated) = assert_full_parse(IdentifierParser::new(&idents).expr(expr)).unwrap();
assert_eq!(evaluated, EvalResult::Str(b"testsuffix".to_vec()));