Как мне создать именованный анализатор пробелов, который также пропускает строковые комментарии? - PullRequest
2 голосов
/ 05 марта 2019

Я пишу парсер для текстового формата в п. 4.2.2, и я использую средство пропуска для пропуска пробела.Я должен использовать собственный анализатор, потому что этот формат обрабатывает некоторые необычные символы как пробелы.Следуя примеру на этой странице, я создал один из них, используя eat_separator.

Как эффективно расширить мой анализатор пространства, чтобы также использовать комментарии строки от # до конца строки?Эти комментарии могут появляться где угодно, кроме как внутри строк.Я всегда хочу выбросить содержание комментария: нет ничего лучше директив препроцессора.

1 Ответ

3 голосов
/ 05 марта 2019

Это сложная проблема; У меня так же было при написании парсера Python.

Вот как я в итоге реализовал «разрыв строки, необязательно предшествующий комментарию»:

named!(pub newline<StrSpan, ()>,
  map!(
    many1!(
      tuple!(
        spaces_nonl,
        opt!(preceded!(char!('#'), many0!(none_of!("\n")))),
        char!('\n')
      )
    ),
    |_| ()
  )
);

named!(pub spaces_nl<StrSpan, ()>,
  map!(many0!(alt!(one_of!(" \t\x0c") => { |_|() } | escaped_newline | newline)), |_| ())
);
named!(pub spaces_nonl<StrSpan, ()>,
  map!(many0!(alt!(one_of!(" \t\x0c") => { |_| () }|escaped_newline)), |_| ())
);

Который вы можете затем использовать для перезаписи ws!, чтобы использовать эту новую функцию (я скопировал код из nom и заменил имя аргумента sep!):

/// Like `ws!()`, but ignores comments as well
macro_rules! ws_comm (
  ($i:expr, $($args:tt)*) => (
    {
      use nom::Convert;
      use nom::Err;

      match sep!($i, spaces_nl, $($args)*) {
        Err(e) => Err(e),
        Ok((i1,o))    => {
          match spaces_nl(i1) {
            Err(e) => Err(Err::convert(e)),
            Ok((i2,_))    => Ok((i2, o))
          }
        }
      }
    }
  )
);

Связанный код, если вам интересно: https://github.com/ProgVal/rust-python-parser/blob/1e03122f030e183096d7d3271907106678036f56/src/helpers.rs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...