summaryrefslogtreecommitdiff
path: root/tests/full/main.rs
diff options
context:
space:
mode:
authorGreg Brown <gmb60@cam.ac.uk>2021-05-06 19:40:59 +0100
committerGreg Brown <gmb60@cam.ac.uk>2021-05-06 19:40:59 +0100
commitdfc08ff2c6580bbeb3951b223e0332546ba3b0d9 (patch)
tree60597dd9492b9c2dfa10ea610289f143dd3e41b7 /tests/full/main.rs
parentef485d6f3e4df6e1a424ba3797388fa0bba6eb2e (diff)
Introduce lambda expressions.
Diffstat (limited to 'tests/full/main.rs')
-rw-r--r--tests/full/main.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/full/main.rs b/tests/full/main.rs
new file mode 100644
index 0000000..95a1f60
--- /dev/null
+++ b/tests/full/main.rs
@@ -0,0 +1,61 @@
+use std::error::Error;
+
+use chomp::{
+ chomp::{
+ ast::substitute::Reduce,
+ typed::{
+ context::Context,
+ lower::{Backend, GenerateCode},
+ TypeInfer,
+ },
+ visit::Visitable,
+ },
+ lower::RustBackend,
+ nibble::{
+ convert::{self, Convert},
+ Statement,
+ },
+};
+use proc_macro2::{Span, TokenStream};
+
+fn chomp(input: &str) -> Result<TokenStream, Box<dyn Error>> {
+ syn::parse_str::<Statement>(&input)
+ .map_err(|e| Box::new(e) as Box<dyn Error>)
+ .and_then(|nibble: Statement| {
+ nibble
+ .convert(&mut convert::Context::default())
+ .map_err(|e| Box::new(e) as Box<dyn Error>)
+ })
+ .and_then(|expr| {
+ expr.fold(&mut Reduce)
+ .map_err(|e| Box::new(e) as Box<dyn Error>)
+ })
+ .and_then(|term| {
+ let mut context = Context::default();
+ term.fold(&mut TypeInfer {
+ context: &mut context,
+ })
+ .map_err(|e| Box::new(e) as Box<dyn Error>)
+ })
+ .map(|typed| {
+ let mut backend = RustBackend::default();
+ let id = typed.gen(&mut backend);
+ backend.emit_code(None, Span::call_site(), id)
+ })
+}
+
+macro_rules! compile {
+ ($name:ident, $file:literal) => {
+ #[test]
+ fn $name() {
+ let input = include_str!($file);
+ chomp(input).unwrap();
+ }
+ };
+}
+
+compile!(compile_sheep, "nibble/sheep.nb");
+compile!(compile_ratata, "nibble/ratata.nb");
+compile!(compile_regex, "nibble/regex.nb");
+compile!(compile_regex_fix, "nibble/regex_fix.nb");
+compile!(compile_nibble, "nibble/nibble_exp.nb");