#![recursion_limit = "128"]
#[macro_use]
extern crate nom;
extern crate nom_locate;
#[cfg(test)]
#[macro_use]
extern crate pretty_assertions;
extern crate unicode_xid;
#[cfg(feature = "unicode-names")]
extern crate unicode_names2;
#[cfg(feature = "bigint")]
extern crate num_bigint;
#[cfg(feature = "bigint")]
extern crate num_traits;
#[cfg(feature = "wtf8")]
extern crate wtf8;
#[macro_use]
mod helpers;
#[macro_use]
mod expressions;
#[macro_use]
mod statements;
pub mod ast;
mod bytes;
pub mod errors;
mod functions;
mod numbers;
mod strings;
pub mod visitors;
use ast::*;
use expressions::*;
use helpers::*;
use statements::*;
pub use helpers::make_strspan;
named_attr!(#[doc = "Parses a single interactive statement, like in the REPL."],
pub parse_single_input <StrSpan, Vec<Statement>>,
alt!(
newline => { |_| Vec::new() }
| call!(statement, 0) => { |stmts| stmts }
)
);
named_attr!(#[doc = "Parses a module or sequence of commands."],
pub file_input <StrSpan, Vec<Statement>>,
fold_many0!(
alt!(
newline => { |_| None }
| eof!() => { |_| None }
| call!(statement, 0) => { |s| Some(s) }
),
Vec::new(),
|acc: Vec<_>, item| { let mut acc = acc; if let Some(s) = item { acc.extend(s); } acc }
)
);
named_attr!(#[doc = "Parses the input of eval()."],
pub eval_input <StrSpan, Vec<Expression>>,
terminated!(ws_nonl!(call!(ExpressionParser::<NewlinesAreNotSpaces>::testlist)), many0!(newline))
);
#[cfg(test)]
mod tests {
use super::*;
use helpers::{assert_parse_eq, make_strspan};
#[test]
fn foo() {
assert_parse_eq(newline(make_strspan("\n")), Ok((make_strspan(""), ())));
assert_parse_eq(
parse_single_input(make_strspan("del foo")),
Ok((
make_strspan(""),
vec![Statement::Del(vec![Expression::Name("foo".to_string())])],
)),
);
assert_parse_eq(
parse_single_input(make_strspan("del foo, bar")),
Ok((
make_strspan(""),
vec![Statement::Del(vec![
Expression::Name("foo".to_string()),
Expression::Name("bar".to_string()),
])],
)),
);
assert_parse_eq(
parse_single_input(make_strspan("del foo; del bar")),
Ok((
make_strspan(""),
vec![
Statement::Del(vec![Expression::Name("foo".to_string())]),
Statement::Del(vec![Expression::Name("bar".to_string())]),
],
)),
);
assert_parse_eq(
parse_single_input(make_strspan("del foo ;del bar")),
Ok((
make_strspan(""),
vec![
Statement::Del(vec![Expression::Name("foo".to_string())]),
Statement::Del(vec![Expression::Name("bar".to_string())]),
],
)),
);
}
}