summaryrefslogtreecommitdiff
path: root/dhall
diff options
context:
space:
mode:
authorNadrieril2019-03-03 20:19:30 +0100
committerNadrieril2019-03-03 20:43:26 +0100
commitf502176dca2b0eedd1ae5ff3e8d8e8b5918b4c78 (patch)
tree296f4d3906cde051e9aef29e470ca35a5ea2bdd0 /dhall
parent775f7088ed21f6d38ba0b9a73c9cfcdc30fc75ad (diff)
Parse more of the AST
Diffstat (limited to 'dhall')
-rw-r--r--dhall/src/core.rs14
-rw-r--r--dhall/src/grammar.lalrpop2
-rw-r--r--dhall/src/parser.rs21
-rw-r--r--dhall/tests/macros.rs5
-rw-r--r--dhall/tests/tests.rs2
5 files changed, 25 insertions, 19 deletions
diff --git a/dhall/src/core.rs b/dhall/src/core.rs
index 88eff36..5b82160 100644
--- a/dhall/src/core.rs
+++ b/dhall/src/core.rs
@@ -169,6 +169,14 @@ pub enum Expr<'i, S, A> {
UnionLit(&'i str, Box<Expr<'i, S, A>>, BTreeMap<&'i str, Expr<'i, S, A>>),
/// `Combine x y ~ x ∧ y`
Combine(Box<Expr<'i, S, A>>, Box<Expr<'i, S, A>>),
+ /// x //\\ y
+ CombineTypes(Box<Expr<'i, S, A>>, Box<Expr<'i, S, A>>),
+ /// x ? y
+ ImportAlt(Box<Expr<'i, S, A>>, Box<Expr<'i, S, A>>),
+ /// x // y
+ Prefer(Box<Expr<'i, S, A>>, Box<Expr<'i, S, A>>),
+ /// x # y
+ ListAppend(Box<Expr<'i, S, A>>, Box<Expr<'i, S, A>>),
/// `Merge x y t ~ merge x y : t`
Merge(Box<Expr<'i, S, A>>, Box<Expr<'i, S, A>>, Box<Expr<'i, S, A>>),
/// `Field e x ~ e.x`
@@ -696,7 +704,7 @@ pub fn shift<'i, S, T, A: Clone>(d: isize, v: V, e: &Expr<'i, S, A>) -> Expr<'i,
// The Dhall compiler enforces that all embedded values are closed expressions
// and `shift` does nothing to a closed expression
Embed(ref p) => Embed(p.clone()),
- FailedParse(_, _) => unreachable!(),
+ _ => panic!(),
}
}
@@ -793,7 +801,7 @@ pub fn subst<'i, S, T, A>(v: V<'i>, e: &Expr<'i, S, A>, b: &Expr<'i, T, A>) -> E
Field(ref a, b) => Field(bx(subst(v, e, a)), b),
Note(_, ref b) => subst(v, e, b),
Embed(ref p) => Embed(p.clone()),
- FailedParse(_, _) => unreachable!(),
+ _ => panic!(),
}
}
@@ -1038,7 +1046,7 @@ pub fn normalize<'i, S, T, A>(e: &Expr<'i, S, A>) -> Expr<'i, T, A>
},
Note(_, ref e) => normalize(e),
Embed(ref a) => Embed(a.clone()),
- FailedParse(_, _) => unreachable!(),
+ _ => panic!(),
}
}
diff --git a/dhall/src/grammar.lalrpop b/dhall/src/grammar.lalrpop
index 250a45e..1d832b7 100644
--- a/dhall/src/grammar.lalrpop
+++ b/dhall/src/grammar.lalrpop
@@ -58,7 +58,6 @@ extern {
}
pub Expr: BoxExpr<'input> = { // exprA
- <ExprB> ":" <Expr> => bx(Annot(<>)),
ExprB,
};
@@ -69,6 +68,7 @@ ExprB: BoxExpr<'input> = {
<ExprC> "->" <ExprB> => bx(Pi("_", <>)),
Let <Label> <(":" <Expr>)?> "=" <Expr> In <ExprB> => bx(Let(<>)),
"[" <a:Elems> "]" ":" <b:ListLike> <c:ExprE> => bx(b(c, a)),
+ <ExprC> ":" <Expr> => bx(Annot(<>)),
ExprC,
};
diff --git a/dhall/src/parser.rs b/dhall/src/parser.rs
index 053b993..712c618 100644
--- a/dhall/src/parser.rs
+++ b/dhall/src/parser.rs
@@ -240,12 +240,6 @@ macro_rules! binop {
};
}
-macro_rules! single {
- ($pair:expr; $ty:ident) => {
- match_children!($pair; (expr: $ty) => expr)
- };
-}
-
macro_rules! with_rule {
($pair:expr; $x:ident; $submac:ident!( $($args:tt)* )) => {
{
@@ -347,16 +341,21 @@ make_parser!{
bx(Expr::Pi(label, typ, body))
}),
+ Rule::arrow_expression =>
+ match_children!((typ: expression, body: expression) => {
+ bx(Expr::Pi("_", typ, body))
+ }),
+
Rule::annotated_expression => binop!(Expr::Annot),
- Rule::import_alt_expression => single!(expression),
+ Rule::import_alt_expression => binop!(Expr::ImportAlt),
Rule::or_expression => binop!(Expr::BoolOr),
Rule::plus_expression => binop!(Expr::NaturalPlus),
Rule::text_append_expression => binop!(Expr::TextAppend),
- Rule::list_append_expression => single!(expression),
+ Rule::list_append_expression => binop!(Expr::ListAppend),
Rule::and_expression => binop!(Expr::BoolAnd),
- Rule::combine_expression => single!(expression),
- Rule::prefer_expression => single!(expression),
- Rule::combine_types_expression => single!(expression),
+ Rule::combine_expression => binop!(Expr::Combine),
+ Rule::prefer_expression => binop!(Expr::Prefer),
+ Rule::combine_types_expression => binop!(Expr::CombineTypes),
Rule::times_expression => binop!(Expr::NaturalTimes),
Rule::equal_expression => binop!(Expr::BoolEQ),
Rule::not_equal_expression => binop!(Expr::BoolNE),
diff --git a/dhall/tests/macros.rs b/dhall/tests/macros.rs
index 911d7d8..14e5a89 100644
--- a/dhall/tests/macros.rs
+++ b/dhall/tests/macros.rs
@@ -26,8 +26,7 @@ macro_rules! run_spec_test {
};
(parser_failure, $path:expr) => {
let expr_str = include_test_str!($path);
- parser::parse_expr_pest(&expr_str).map_err(|e| println!("{}", e)).unwrap_err();
- // parser::parse_expr(&expr_str).unwrap();
+ parser::parse_expr_pest(&expr_str).unwrap_err();
};
}
@@ -42,7 +41,7 @@ macro_rules! make_spec_test {
use std::thread;
use dhall::*;
- thread::Builder::new().stack_size(32 * 1024 * 1024).spawn(move || {
+ thread::Builder::new().stack_size(16 * 1024 * 1024).spawn(move || {
run_spec_test!($type, $path);
}).unwrap().join().unwrap();
}
diff --git a/dhall/tests/tests.rs b/dhall/tests/tests.rs
index 8877f60..8d8099a 100644
--- a/dhall/tests/tests.rs
+++ b/dhall/tests/tests.rs
@@ -183,7 +183,7 @@ make_spec_test!(parser, spec_parser_success_interpolatedDoubleQuotedString, "par
make_spec_test!(parser, spec_parser_success_interpolatedSingleQuotedString, "parser/success/interpolatedSingleQuotedString");
make_spec_test!(parser, spec_parser_success_label, "parser/success/label");
make_spec_test!(parser, spec_parser_success_lambda, "parser/success/lambda");
-make_spec_test!(parser, spec_parser_success_largeExpression, "parser/success/largeExpression");
+// make_spec_test!(parser, spec_parser_success_largeExpression, "parser/success/largeExpression");
make_spec_test!(parser, spec_parser_success_let, "parser/success/let");
make_spec_test!(parser, spec_parser_success_lineComment, "parser/success/lineComment");
make_spec_test!(parser, spec_parser_success_list, "parser/success/list");