From 564a5f37b106c69d8ebe9aec2f665f5222b3dfda Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Wed, 6 Mar 2019 12:19:26 +0100 Subject: Split-off core into its own crate --- dhall_core/src/grammar.lalrpop | 164 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 dhall_core/src/grammar.lalrpop (limited to 'dhall_core/src/grammar.lalrpop') diff --git a/dhall_core/src/grammar.lalrpop b/dhall_core/src/grammar.lalrpop new file mode 100644 index 0000000..1ffe2ff --- /dev/null +++ b/dhall_core/src/grammar.lalrpop @@ -0,0 +1,164 @@ +use std::collections::BTreeMap; +use std::iter; +use std::iter::FromIterator; + +use crate::core; +use crate::core::bx; +use crate::core::Expr::*; +use crate::core::Builtin; +use crate::core::Builtin::*; +use crate::core::BinOp::*; +use crate::grammar_util::*; +use crate::lexer::*; + +grammar<'input>; + +extern { + type Location = usize; + type Error = LexicalError; + + enum Tok<'input> { + Pi => Tok::Pi, + Lambda => Tok::Lambda, + Combine => Tok::Combine, + "->" => Tok::Arrow, + + Int => Tok::Integer(), + Nat => Tok::Natural(), + Text => Tok::Text(), + Bool => Tok::Bool(), + Label => Tok::Identifier(<&'input str>), + Const => Tok::Const(), + Let => Tok::Keyword(Keyword::Let), + In => Tok::Keyword(Keyword::In), + If => Tok::Keyword(Keyword::If), + Then => Tok::Keyword(Keyword::Then), + Else => Tok::Keyword(Keyword::Else), + List => Tok::ListLike(ListLike::List), + Optional => Tok::ListLike(ListLike::Optional), + Builtin => Tok::Builtin(), + + "{" => Tok::BraceL, + "}" => Tok::BraceR, + "[" => Tok::BracketL, + "]" => Tok::BracketR, + "(" => Tok::ParenL, + ")" => Tok::ParenR, + "&&" => Tok::BoolAnd, + "||" => Tok::BoolOr, + "==" => Tok::CompareEQ, + "!=" => Tok::CompareNE, + "++" => Tok::Append, + "*" => Tok::Times, + "+" => Tok::Plus, + "," => Tok::Comma, + "." => Tok::Dot, + ":" => Tok::Ascription, + "=" => Tok::Equals, + } +} + +pub Expr: BoxExpr<'input> = { // exprA + ExprB, +}; + +ExprB: BoxExpr<'input> = { + Lambda "("