这是一个棘手的问题;我在编写 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)), |_| ())
);
Run Code Online (Sandbox Code Playgroud)
然后您可以使用它来重写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))
}
}
}
}
)
);
Run Code Online (Sandbox Code Playgroud)
相关代码,如果您好奇的话:https://github.com/ProgVal/rust-python-parser/blob/1e03122f030e183096d7d3271907106678036f56/src/helpers.rs
| 归档时间: |
|
| 查看次数: |
1243 次 |
| 最近记录: |