Помещение нового имени функции во внутренний макрос - PullRequest
0 голосов
/ 04 мая 2019

пытается написать действительно базовый макрос в Rust. Я пытаюсь превратить многострочное объявление (используя nom) в одну строку, так как оно копируется в огромных количествах. Вот макрос, который я пытаюсь определить:

macro_rules! tag_parser {
    ($name:ident, $tag:expr, $ret:expr) => {
        nom::named!(
            $name<&str, AnsiSequence>,
            nom::do_parse!(
                nom::tag!($tag) >>
                ($ret)
            )
        );
    }
}

А вот пример вызова:

tag_parser!(cursor_restore, "u", AnsiSequence::CursorRestore);

Я получаю следующую ошибку:

error: no rules expected the token `cursor_restore`
  --> src/parsers.rs:95:13
   |
95 | tag_parser!(cursor_restore, "u", AnsiSequence::CursorRestore);
   |             ^^^^^^^^^^^^^^^^ no rules expected this token in macro call

Действительно, проблема сосредоточена вокруг первого параметра. По какой-то причине он не позволит мне разместить его так, как у меня внутри макроса. Я не уверен, что это из-за того, что я вызываю другой макрос (с именем!) Или что-то еще. Любая помощь будет принята с благодарностью, спасибо!

1 Ответ

1 голос
/ 04 мая 2019

Я не могу сказать, почему расширение макроса терпит неудачу так, как это происходит. Тем не менее, он зацикливается на полном пути к номин-макросу, вызываемому в расширении. Если вы добавите use nom::*;, чтобы заранее ввести в область действия do_parse и named и убрать два nom:: -фрагмента (nom::named!... -> named!...) из макротела, это сработает.

...