extern crate pest;
extern crate pest_meta;
#[macro_use]
extern crate pest_vm;
use pest_meta::parser::Rule;
use pest_meta::{optimizer, parser};
use pest_vm::Vm;
const GRAMMAR: &'static str = include_str!("lists.pest");
fn vm() -> Vm {
let pairs = parser::parse(Rule::grammar_rules, GRAMMAR).unwrap();
let ast = parser::consume_rules(pairs).unwrap();
Vm::new(optimizer::optimize(ast))
}
#[test]
fn item() {
parses_to! {
parser: vm(),
input: "- a",
rule: "lists",
tokens: [
item(2, 3)
]
};
}
#[test]
fn items() {
parses_to! {
parser: vm(),
input: "- a\n- b",
rule: "lists",
tokens: [
item(2, 3),
item(6, 7)
]
};
}
#[test]
fn children() {
parses_to! {
parser: vm(),
input: " - b",
rule: "children",
tokens: [
children(0, 5, [
item(4, 5)
])
]
};
}
#[test]
fn nested_item() {
parses_to! {
parser: vm(),
input: "- a\n - b",
rule: "lists",
tokens: [
item(2, 3),
children(4, 9, [
item(8, 9)
])
]
};
}
#[test]
fn nested_items() {
parses_to! {
parser: vm(),
input: "- a\n - b\n - c",
rule: "lists",
tokens: [
item(2, 3),
children(4, 15, [
item(8, 9),
item(14, 15)
])
]
};
}
#[test]
fn nested_two_levels() {
parses_to! {
parser: vm(),
input: "- a\n - b\n - c",
rule: "lists",
tokens: [
item(2, 3),
children(4, 17, [
item(8, 9),
children(10, 17, [
item(16, 17)
])
])
]
};
}
#[test]
fn nested_then_not() {
parses_to! {
parser: vm(),
input: "- a\n - b\n- c",
rule: "lists",
tokens: [
item(2, 3),
children(4, 9, [
item(8, 9)
]),
item(12, 13)
]
};
}