From 72ad56209fe10e3120c19ca5b820ff267423ab1d Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sat, 11 Apr 2020 15:41:21 +0100 Subject: spec: fix precedence of `===` and `with` --- dhall/src/syntax/text/dhall.abnf | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'dhall/src/syntax/text/dhall.abnf') diff --git a/dhall/src/syntax/text/dhall.abnf b/dhall/src/syntax/text/dhall.abnf index 1c3a980..861f7b3 100644 --- a/dhall/src/syntax/text/dhall.abnf +++ b/dhall/src/syntax/text/dhall.abnf @@ -757,6 +757,11 @@ expression = ; NOTE: Backtrack if parsing this alternative fails / operator-expression whsp arrow whsp expression + ; "a with x = b" + ; + ; NOTE: Backtrack if parsing this alternative fails + / with-expression + ; "merge e1 e2 : t" ; ; NOTE: Backtrack if parsing this alternative fails since we can't tell @@ -792,9 +797,16 @@ let-binding = let whsp1 nonreserved-label whsp [ ":" whsp1 expression whsp ] "=" empty-list-literal = "[" whsp [ "," whsp ] "]" whsp ":" whsp1 application-expression -operator-expression = import-alt-expression +with-expression = + import-expression 1*(whsp1 with whsp1 with-clause) + +with-clause = + any-label-or-some *(whsp "." whsp any-label-or-some) whsp "=" whsp operator-expression + +operator-expression = equivalent-expression ; Nonempty-whitespace to disambiguate `http://a/a?a` +equivalent-expression = import-alt-expression *(whsp equivalent whsp import-alt-expression) import-alt-expression = or-expression *(whsp "?" whsp1 or-expression) or-expression = plus-expression *(whsp "||" whsp plus-expression) ; Nonempty-whitespace to disambiguate `f +2` @@ -807,13 +819,7 @@ prefer-expression = combine-types-expression *(whsp prefer whsp combine-t combine-types-expression = times-expression *(whsp combine-types whsp times-expression) times-expression = equal-expression *(whsp "*" whsp equal-expression) equal-expression = not-equal-expression *(whsp "==" whsp not-equal-expression) -not-equal-expression = equivalent-expression *(whsp "!=" whsp equivalent-expression) -equivalent-expression = with-expression *(whsp equivalent whsp with-expression) - -with-expression = application-expression *(whsp1 with whsp1 with-clause) - -with-clause = - any-label-or-some *(whsp "." whsp any-label-or-some) whsp "=" whsp application-expression +not-equal-expression = application-expression *(whsp "!=" whsp application-expression) ; Import expressions need to be separated by some whitespace, otherwise there -- cgit v1.2.3 From 2cb647a1af179662832fb978b90f0b1df6e3dc18 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Thu, 25 Jun 2020 13:55:49 +0100 Subject: spec: allow quoted labels to be empty --- dhall/src/syntax/text/dhall.abnf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dhall/src/syntax/text/dhall.abnf') diff --git a/dhall/src/syntax/text/dhall.abnf b/dhall/src/syntax/text/dhall.abnf index 861f7b3..05d76e6 100644 --- a/dhall/src/syntax/text/dhall.abnf +++ b/dhall/src/syntax/text/dhall.abnf @@ -206,7 +206,7 @@ quoted-label-char = ; %x60 = '`' / %x61-7E -quoted-label = 1*quoted-label-char +quoted-label = *quoted-label-char ; NOTE: Dhall does not support Unicode labels, mainly to minimize the potential ; for code obfuscation -- cgit v1.2.3 From e3cdf3f386b6a682981e6bdf6ca6d215b0d0788d Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Thu, 25 Jun 2020 14:06:24 +0100 Subject: spec: not all ABNF parsers like empty rules --- dhall/src/syntax/text/dhall.abnf | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) (limited to 'dhall/src/syntax/text/dhall.abnf') diff --git a/dhall/src/syntax/text/dhall.abnf b/dhall/src/syntax/text/dhall.abnf index 05d76e6..362a436 100644 --- a/dhall/src/syntax/text/dhall.abnf +++ b/dhall/src/syntax/text/dhall.abnf @@ -896,11 +896,9 @@ primitive-expression = record-type-or-literal = empty-record-literal - / non-empty-record-type-or-literal - / empty-record-type + / [non-empty-record-type-or-literal] empty-record-literal = "=" -empty-record-type = "" non-empty-record-type-or-literal = (non-empty-record-type / non-empty-record-literal) @@ -913,22 +911,18 @@ record-type-entry = any-label-or-some whsp ":" whsp1 expression non-empty-record-literal = record-literal-entry *(whsp "," whsp record-literal-entry) +; If the `record-literal-normal-entry` is absent, that represents a punned +; record entry, such as in `{ x }`, which is a short-hand for `{ x = x }` record-literal-entry = - any-label-or-some (record-literal-normal-entry / record-literal-punned-entry) + any-label-or-some [record-literal-normal-entry] record-literal-normal-entry = *(whsp "." whsp any-label-or-some) whsp "=" whsp expression -record-literal-punned-entry = "" - +; If the `union-type-entry` is absent, that represents an empty union +; alternative, such as in `< Heads | Tails >` union-type = - non-empty-union-type - / empty-union-type - -empty-union-type = "" - -non-empty-union-type = - union-type-entry *(whsp "|" whsp union-type-entry) + [union-type-entry *(whsp "|" whsp union-type-entry)] ; x : Natural ; x -- cgit v1.2.3 From 812fb88102082493d1176aab7ee61b5339821492 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Thu, 25 Jun 2020 14:09:24 +0100 Subject: spec: ensure `keyword` rule only matches keywords --- dhall/src/syntax/text/dhall.abnf | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'dhall/src/syntax/text/dhall.abnf') diff --git a/dhall/src/syntax/text/dhall.abnf b/dhall/src/syntax/text/dhall.abnf index 362a436..26f6eab 100644 --- a/dhall/src/syntax/text/dhall.abnf +++ b/dhall/src/syntax/text/dhall.abnf @@ -370,7 +370,9 @@ NaN = %x4e.61.4e Some = %x53.6f.6d.65 toMap = %x74.6f.4d.61.70 assert = %x61.73.73.65.72.74 -forall = %x2200 / %x66.6f.72.61.6c.6c ; "∀" / "forall" +forall-keyword = %x66.6f.72.61.6c.6c ; "forall" +forall-symbol = %x2200 ; "∀" +forall = forall-symbol / forall-keyword with = %x77.69.74.68 ; Unused rule that could be used as negative lookahead in the @@ -382,7 +384,7 @@ keyword = / assert / as / Infinity / NaN / merge / Some / toMap - / forall + / forall-keyword / with builtin = -- cgit v1.2.3 From 8fd2fb4871335c72b9448da4a66144fd7f986f09 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Thu, 25 Jun 2020 14:21:02 +0100 Subject: spec!: remove the ability to quote paths in URLs --- dhall/src/syntax/text/dhall.abnf | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'dhall/src/syntax/text/dhall.abnf') diff --git a/dhall/src/syntax/text/dhall.abnf b/dhall/src/syntax/text/dhall.abnf index 26f6eab..4061de2 100644 --- a/dhall/src/syntax/text/dhall.abnf +++ b/dhall/src/syntax/text/dhall.abnf @@ -582,7 +582,6 @@ scheme = %x68.74.74.70 [ %x73 ] ; "http" [ "s" ] ; NOTE: This does not match the official grammar for a URI. Specifically: ; -; * path segments may be quoted instead of using percent-encoding ; * this does not support fragment identifiers, which have no meaning within ; Dhall expressions and do not affect import resolution ; * the characters "(" ")" and "," are not included in the `sub-delims` rule: @@ -595,13 +594,9 @@ scheme = %x68.74.74.70 [ %x73 ] ; "http" [ "s" ] ; ; Reserved characters in quoted path components should be percent-encoded ; according to https://tools.ietf.org/html/rfc3986#section-2 -http-raw = scheme "://" authority url-path [ "?" query ] +http-raw = scheme "://" authority path-abempty [ "?" query ] -; Temporary rule to allow old-style `path-component`s and RFC3986 `segment`s in -; the same grammar. Eventually we can just use `path-abempty` from the same -; RFC. See issue #581 - -url-path = *(path-component / "/" segment) +path-abempty = *( "/" segment ) ; NOTE: Backtrack if parsing the optional user info prefix fails authority = [ userinfo "@" ] host [ ":" port ] -- cgit v1.2.3 From ba61655649f4dd6117125430e49aba5ce4f92392 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Thu, 25 Jun 2020 14:22:48 +0100 Subject: spec: remove Unicode character from `dhall.abnf` --- dhall/src/syntax/text/dhall.abnf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dhall/src/syntax/text/dhall.abnf') diff --git a/dhall/src/syntax/text/dhall.abnf b/dhall/src/syntax/text/dhall.abnf index 4061de2..173209c 100644 --- a/dhall/src/syntax/text/dhall.abnf +++ b/dhall/src/syntax/text/dhall.abnf @@ -371,7 +371,7 @@ Some = %x53.6f.6d.65 toMap = %x74.6f.4d.61.70 assert = %x61.73.73.65.72.74 forall-keyword = %x66.6f.72.61.6c.6c ; "forall" -forall-symbol = %x2200 ; "∀" +forall-symbol = %x2200 ; Unicode FOR ALL forall = forall-symbol / forall-keyword with = %x77.69.74.68 -- cgit v1.2.3 From ac7e39a752c41c06155e27e84404c67c1341065d Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Thu, 25 Jun 2020 14:28:48 +0100 Subject: spec!: remove Optional/build and Optional/fold --- dhall/src/syntax/text/dhall.abnf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'dhall/src/syntax/text/dhall.abnf') diff --git a/dhall/src/syntax/text/dhall.abnf b/dhall/src/syntax/text/dhall.abnf index 173209c..37ec43b 100644 --- a/dhall/src/syntax/text/dhall.abnf +++ b/dhall/src/syntax/text/dhall.abnf @@ -387,6 +387,9 @@ keyword = / forall-keyword / with +; Note that there is a corresponding parser test in +; `tests/parser/success/builtinsA.dhall`. Please update it when +; you modify this `builtin` rule. builtin = Natural-fold / Natural-build @@ -408,8 +411,6 @@ builtin = / List-last / List-indexed / List-reverse - / Optional-fold - / Optional-build / Text-show / Bool / True @@ -462,8 +463,6 @@ List-head = %x4c.69.73.74.2f.68.65.61.64 List-last = %x4c.69.73.74.2f.6c.61.73.74 List-indexed = %x4c.69.73.74.2f.69.6e.64.65.78.65.64 List-reverse = %x4c.69.73.74.2f.72.65.76.65.72.73.65 -Optional-fold = %x4f.70.74.69.6f.6e.61.6c.2f.66.6f.6c.64 -Optional-build = %x4f.70.74.69.6f.6e.61.6c.2f.62.75.69.6c.64 Text-show = %x54.65.78.74.2f.73.68.6f.77 ; Operators -- cgit v1.2.3