use core; use core::Expr::*; use grammar_util::*; use lexer::*; use std::collections::HashMap; use std::iter; use std::iter::FromIterator; grammar; extern { type Location = usize; type Error = LexicalError; enum Tok { Pi => Tok::Pi, Lambda => Tok::Lambda, Combine => Tok::Combine, "->" => Tok::Arrow, Int => Tok::Integer(), Nat => Tok::Natural(), Bool => Tok::Bool(), Label => Tok::Identifier(), 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 = { // exprA ":" => bx(Annot(<>)), ExprB, }; ExprB: BoxExpr = { Lambda "("