From 4b99a3fb46191a83fa8551f21b98cff689bbb338 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Thu, 21 Mar 2019 22:08:23 +0100 Subject: Improve import handling in parser --- dhall_core/src/core.rs | 6 +++--- dhall_core/src/parser.rs | 21 ++++++++++++++++----- dhall_core/src/printer.rs | 14 +++++++++++++- 3 files changed, 32 insertions(+), 9 deletions(-) (limited to 'dhall_core') diff --git a/dhall_core/src/core.rs b/dhall_core/src/core.rs index 9f26b65..bc5a666 100644 --- a/dhall_core/src/core.rs +++ b/dhall_core/src/core.rs @@ -164,9 +164,9 @@ pub enum Builtin { TextShow, } -pub type ParsedExpr = SubExpr; -pub type ResolvedExpr = SubExpr; -pub type DhallExpr = ResolvedExpr; +pub type ParsedExpr = SubExpr; +pub type ResolvedExpr = SubExpr; +pub type DhallExpr = ResolvedExpr; pub type SubExpr = Rc>; diff --git a/dhall_core/src/parser.rs b/dhall_core/src/parser.rs index 7de75d2..865e791 100644 --- a/dhall_core/src/parser.rs +++ b/dhall_core/src/parser.rs @@ -12,7 +12,6 @@ use crate::*; // their own crate because they are quite general and useful. For now they // are here and hopefully you can figure out how they work. -type ParsedExpr = crate::ParsedExpr; type ParsedText = InterpolatedText; type ParsedTextContents<'a> = InterpolatedTextContents<'a, X, Import>; @@ -370,9 +369,21 @@ make_parser! { } ); - rule!(path; - captured_str!(s) => (".".to_owned() + s).into() - ); + rule!(unquoted_path_component<&'a str>; captured_str!(s) => s); + rule!(quoted_path_component<&'a str>; captured_str!(s) => s); + rule!(path_component<&'a str>; children!( + [unquoted_path_component(s)] => s, + [quoted_path_component(s)] => s, + )); + rule!(path; children!( + [path_component(components..)] => { + let mut path = PathBuf::new(); + for s in components { + path.push(s); + } + path + } + )); rule_group!(local_raw<(FilePrefix, PathBuf)>); @@ -728,7 +739,7 @@ make_parser! { )); } -pub fn parse_expr(s: &str) -> ParseResult> { +pub fn parse_expr(s: &str) -> ParseResult { let mut pairs = DhallParser::parse(Rule::final_expression, s)?; let expr = parse_any(pairs.next().unwrap())?; assert_eq!(pairs.next(), None); diff --git a/dhall_core/src/printer.rs b/dhall_core/src/printer.rs index e43f1be..bd38863 100644 --- a/dhall_core/src/printer.rs +++ b/dhall_core/src/printer.rs @@ -286,7 +286,19 @@ impl Display for Const { impl Display for Import { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - ::fmt(self, f) + use FilePrefix::*; + use ImportLocation::*; + match &self.location { + Local(prefix, path) => { + let prefix = match prefix { + Here => ".", + Parent => "..", + Home => "~", + Absolute => "", + }; + write!(f, "{}/{}", prefix, path.to_str().unwrap()) + } + } } } -- cgit v1.2.3