From 94b7859093168f0606e05b5e7a954998e565ce5f Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Tue, 21 Nov 2023 12:17:44 +0200 Subject: [PATCH 01/11] Add .keywords to ABNF --- spec/message.abnf | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/spec/message.abnf b/spec/message.abnf index bd340fe9f2..4da37b722f 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -1,18 +1,30 @@ -message = pattern / complex-message +message = simple-message / complex-message -complex-message = "{{" [s] *(declaration [s]) body [s] "}}" +simple-message = [almost-keyword] + / ((almost-keyword not-keyword / text-start / expression) pattern) +complex-message = *(declaration [s]) body -declaration = input-declaration / local-declaration +declaration = input-declaration / local-declaration / reserved-declaration input-declaration = input [s] variable-expression local-declaration = local s variable [s] "=" [s] expression +reserved-declaration = "." 4*(%x61-7A) reserved-body 1*expression + +almost-keyword = "." *3(%x61-7A) +not-keyword = %x0-5B ; omit \ + / %x5D-60 ; omit a-z and { + / %x7C ; omit } + / %x7E-D7FF ; omit surrogates + / %xE000-10FFFF + / expression body = quoted-pattern / (selectors 1*([s] variant)) quoted-pattern = "{{" pattern "}}" pattern = *(text / expression) + selectors = match 1*([s] expression) -variant = when 1*(s key) [s] quoted-pattern +variant = 1*(s key) [s] quoted-pattern key = literal / "*" expression = literal-expression / variable-expression / function-expression @@ -26,18 +38,19 @@ variable = "$" name function = (":" / "+" / "-") name option = name [s] "=" [s] (literal / variable) -; reserved keywords are always lowercase -input = %s"input" -local = %s"local" -match = %s"match" -when = %s"when" +; keywords always consist of a . followed by at least four lower-case a-z letters +input = %s".input" +local = %s".local" +match = %s".match" text = 1*(text-char / text-escape) -text-char = %x0-5B ; omit \ - / %x5D-7A ; omit { - / %x7C ; omit } - / %x7E-D7FF ; omit surrogates - / %xE000-10FFFF +text-start = %x0-2D ; omit . + / %x2F-5B ; omit \ + / %x5D-7A ; omit { + / %x7C ; omit } + / %x7E-D7FF ; omit surrogates + / %xE000-10FFFF +text-char = text-start / "." quoted = "|" *(quoted-char / quoted-escape) "|" quoted-char = %x0-5B ; omit \ @@ -60,7 +73,7 @@ private-start = "^" / "&" ; future versions of this specification reserved = reserved-start reserved-body reserved-start = "!" / "@" / "#" / "%" / "*" / "<" / ">" / "/" / "?" / "~" -reserved-body = *( [s] 1*(reserved-char / reserved-escape / quoted)) +reserved-body = *([s] 1*(reserved-char / reserved-escape / quoted)) reserved-char = %x00-08 ; omit HTAB and LF / %x0B-0C ; omit CR @@ -81,7 +94,7 @@ name-start = ALPHA / "_" name-char = name-start / DIGIT / "-" / "." / ":" / %xB7 / %x300-36F / %x203F-2040 -text-escape = backslash ( backslash / "{" / "}" ) +text-escape = backslash ( backslash / "." / "{" / "}" ) quoted-escape = backslash ( backslash / "|" ) reserved-escape = backslash ( backslash / "{" / "|" / "}" ) backslash = %x5C ; U+005C REVERSE SOLIDUS "\" From 915cbb7f096815d4c6d908fb8bfac162dfe86b1b Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Tue, 21 Nov 2023 20:03:38 +0200 Subject: [PATCH 02/11] Consider all messages starting with . as complex --- spec/message.abnf | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/spec/message.abnf b/spec/message.abnf index 4da37b722f..8a51114826 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -1,27 +1,19 @@ message = simple-message / complex-message -simple-message = [almost-keyword] - / ((almost-keyword not-keyword / text-start / expression) pattern) -complex-message = *(declaration [s]) body +simple-message = [simple-start pattern] +simple-start = text-start / text-escape / expression +pattern = *(text / expression) + +complex-message = *(declaration [s]) complex-body declaration = input-declaration / local-declaration / reserved-declaration input-declaration = input [s] variable-expression local-declaration = local s variable [s] "=" [s] expression -reserved-declaration = "." 4*(%x61-7A) reserved-body 1*expression - -almost-keyword = "." *3(%x61-7A) -not-keyword = %x0-5B ; omit \ - / %x5D-60 ; omit a-z and { - / %x7C ; omit } - / %x7E-D7FF ; omit surrogates - / %xE000-10FFFF - / expression - -body = quoted-pattern - / (selectors 1*([s] variant)) +reserved-declaration = "." reserved-body 1*expression +complex-body = quoted-pattern + / (selectors 1*([s] variant)) quoted-pattern = "{{" pattern "}}" -pattern = *(text / expression) selectors = match 1*([s] expression) variant = 1*(s key) [s] quoted-pattern @@ -38,7 +30,7 @@ variable = "$" name function = (":" / "+" / "-") name option = name [s] "=" [s] (literal / variable) -; keywords always consist of a . followed by at least four lower-case a-z letters +; keywords always consist of a . followed by lower-case a-z letters input = %s".input" local = %s".local" match = %s".match" From 1b79024f9471f2b1cfa41c9c12d9528a082d386d Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Wed, 22 Nov 2023 07:28:40 +0200 Subject: [PATCH 03/11] Rename text-start as simple-start-char, drop text, fix whitespace Co-authored-by: Richard Gibson --- spec/message.abnf | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/spec/message.abnf b/spec/message.abnf index 8a51114826..227310c6e6 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -1,11 +1,10 @@ message = simple-message / complex-message simple-message = [simple-start pattern] -simple-start = text-start / text-escape / expression +simple-start = simple-start-char / text-escape / expression +pattern = *(text-char / text-escape / expression) -pattern = *(text / expression) - -complex-message = *(declaration [s]) complex-body +complex-message = *(declaration [s]) complex-body [s] declaration = input-declaration / local-declaration / reserved-declaration input-declaration = input [s] variable-expression local-declaration = local s variable [s] "=" [s] expression @@ -16,7 +15,7 @@ complex-body = quoted-pattern quoted-pattern = "{{" pattern "}}" selectors = match 1*([s] expression) -variant = 1*(s key) [s] quoted-pattern +variant = key *(s key) [s] quoted-pattern key = literal / "*" expression = literal-expression / variable-expression / function-expression @@ -30,19 +29,17 @@ variable = "$" name function = (":" / "+" / "-") name option = name [s] "=" [s] (literal / variable) -; keywords always consist of a . followed by lower-case a-z letters input = %s".input" local = %s".local" match = %s".match" -text = 1*(text-char / text-escape) -text-start = %x0-2D ; omit . - / %x2F-5B ; omit \ - / %x5D-7A ; omit { - / %x7C ; omit } - / %x7E-D7FF ; omit surrogates - / %xE000-10FFFF -text-char = text-start / "." +simple-start-char = %x0-2D ; omit . + / %x2F-5B ; omit \ + / %x5D-7A ; omit { + / %x7C ; omit } + / %x7E-D7FF ; omit surrogates + / %xE000-10FFFF +text-char = simple-start-char-start / "." quoted = "|" *(quoted-char / quoted-escape) "|" quoted-char = %x0-5B ; omit \ From 84ed2f10ba128c9c631dff495b16e9ce6507990d Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Wed, 22 Nov 2023 07:32:20 +0200 Subject: [PATCH 04/11] Rename reserved-declaration as reserved-syntax --- spec/message.abnf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/message.abnf b/spec/message.abnf index 227310c6e6..83aa03ecb5 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -5,10 +5,10 @@ simple-start = simple-start-char / text-escape / expression pattern = *(text-char / text-escape / expression) complex-message = *(declaration [s]) complex-body [s] -declaration = input-declaration / local-declaration / reserved-declaration +declaration = input-declaration / local-declaration / reserved-syntax input-declaration = input [s] variable-expression local-declaration = local s variable [s] "=" [s] expression -reserved-declaration = "." reserved-body 1*expression +reserved-syntax = "." reserved-body 1*expression complex-body = quoted-pattern / (selectors 1*([s] variant)) From 9e1d77590a17c48a9d405a87e1975e99ff2b9ae6 Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Wed, 22 Nov 2023 08:03:55 +0200 Subject: [PATCH 05/11] Rename & group reserved syntax rules together --- spec/message.abnf | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/spec/message.abnf b/spec/message.abnf index 83aa03ecb5..bb9fc09cce 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -5,10 +5,9 @@ simple-start = simple-start-char / text-escape / expression pattern = *(text-char / text-escape / expression) complex-message = *(declaration [s]) complex-body [s] -declaration = input-declaration / local-declaration / reserved-syntax +declaration = input-declaration / local-declaration / reserved-keyword input-declaration = input [s] variable-expression local-declaration = local s variable [s] "=" [s] expression -reserved-syntax = "." reserved-body 1*expression complex-body = quoted-pattern / (selectors 1*([s] variant)) @@ -22,7 +21,9 @@ expression = literal-expression / variable-expression / function-expression literal-expression = "{" [s] literal [s annotation] [s] "}" variable-expression = "{" [s] variable [s annotation] [s] "}" function-expression = "{" [s] annotation [s] "}" -annotation = (function *(s option)) / reserved / private-use +annotation = (function *(s option)) + / reserved-annotation + / private-use-annotation literal = quoted / unquoted variable = "$" name @@ -54,16 +55,18 @@ unquoted-start = name-start / DIGIT / "." / %xB7 / %x300-36F / %x203F-2040 -; reserve sigils for private-use by implementations -private-use = private-start reserved-body -private-start = "^" / "&" +; Reserve additional .keywords for use by future versions of this specification. +; Note that the following expression is a simplification, +; as this rule MUST NOT be considered to match existing keywords: +; (input / local / match) (s / "{") +reserved-keyword = "." reserved-body 1*expression -; reserve additional sigils for use by -; future versions of this specification -reserved = reserved-start reserved-body -reserved-start = "!" / "@" / "#" / "%" / "*" / "<" / ">" / "/" / "?" / "~" -reserved-body = *([s] 1*(reserved-char / reserved-escape / quoted)) +; Reserve additional sigils for use by future versions of this specification. +reserved-annotation = reserved-annotation-start reserved-body +reserved-annotation-start = "!" / "@" / "#" / "%" / "*" + / "<" / ">" / "/" / "?" / "~" +reserved-body = *([s] 1*(reserved-char / reserved-escape / quoted)) reserved-char = %x00-08 ; omit HTAB and LF / %x0B-0C ; omit CR / %x0E-19 ; omit SP @@ -72,6 +75,10 @@ reserved-char = %x00-08 ; omit HTAB and LF / %x7E-D7FF ; omit surrogates / %xE000-10FFFF +; Reserve sigils for private-use by implementations. +private-use-annotation = private-start reserved-body +private-start = "^" / "&" + ; based on https://www.w3.org/TR/xml/#NT-Name, ; but cannot start with U+003A COLON ":" name = name-start *name-char From 22203677ff75450a72a688fb045e1675a1bc766c Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Wed, 22 Nov 2023 08:15:10 +0200 Subject: [PATCH 06/11] Fix typo --- spec/message.abnf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/message.abnf b/spec/message.abnf index bb9fc09cce..4ddef114a1 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -40,7 +40,7 @@ simple-start-char = %x0-2D ; omit . / %x7C ; omit } / %x7E-D7FF ; omit surrogates / %xE000-10FFFF -text-char = simple-start-char-start / "." +text-char = simple-start-char / "." quoted = "|" *(quoted-char / quoted-escape) "|" quoted-char = %x0-5B ; omit \ From 49bb6e508f0645ec2eb6bd806dfcd55648b6a21f Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Wed, 22 Nov 2023 23:55:14 +0200 Subject: [PATCH 07/11] Rename reserved-keyword as reserved-statement --- spec/message.abnf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/message.abnf b/spec/message.abnf index 4ddef114a1..5d7ba4820f 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -5,7 +5,7 @@ simple-start = simple-start-char / text-escape / expression pattern = *(text-char / text-escape / expression) complex-message = *(declaration [s]) complex-body [s] -declaration = input-declaration / local-declaration / reserved-keyword +declaration = input-declaration / local-declaration / reserved-statement input-declaration = input [s] variable-expression local-declaration = local s variable [s] "=" [s] expression @@ -59,7 +59,7 @@ unquoted-start = name-start / DIGIT / "." ; Note that the following expression is a simplification, ; as this rule MUST NOT be considered to match existing keywords: ; (input / local / match) (s / "{") -reserved-keyword = "." reserved-body 1*expression +reserved-statement = "." reserved-body 1*expression ; Reserve additional sigils for use by future versions of this specification. reserved-annotation = reserved-annotation-start reserved-body From 2340a17caed22df62f764c191d077a3fe375766d Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Mon, 27 Nov 2023 14:21:00 +0200 Subject: [PATCH 08/11] Apply suggestions from code review --- spec/message.abnf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/message.abnf b/spec/message.abnf index 5d7ba4820f..0a3219ff6e 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -4,13 +4,13 @@ simple-message = [simple-start pattern] simple-start = simple-start-char / text-escape / expression pattern = *(text-char / text-escape / expression) -complex-message = *(declaration [s]) complex-body [s] +complex-message = *(declaration [s]) complex-body declaration = input-declaration / local-declaration / reserved-statement input-declaration = input [s] variable-expression local-declaration = local s variable [s] "=" [s] expression complex-body = quoted-pattern - / (selectors 1*([s] variant)) + / ((selectors / reserved-statement) 1*([s] variant)) quoted-pattern = "{{" pattern "}}" selectors = match 1*([s] expression) From ecc9711ee70aeb356e9467a3adaed1864a2919cf Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Tue, 28 Nov 2023 00:02:21 +0200 Subject: [PATCH 09/11] Drop \. escapes --- spec/message.abnf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/message.abnf b/spec/message.abnf index 0a3219ff6e..81c10ee460 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -90,7 +90,7 @@ name-start = ALPHA / "_" name-char = name-start / DIGIT / "-" / "." / ":" / %xB7 / %x300-36F / %x203F-2040 -text-escape = backslash ( backslash / "." / "{" / "}" ) +text-escape = backslash ( backslash / "{" / "}" ) quoted-escape = backslash ( backslash / "|" ) reserved-escape = backslash ( backslash / "{" / "|" / "}" ) backslash = %x5C ; U+005C REVERSE SOLIDUS "\" From e4f3c36c925e5b47a147a1c3b9bd1f1773346fb0 Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Tue, 28 Nov 2023 18:13:21 +0200 Subject: [PATCH 10/11] Add reserved-keyword to reserved-statement --- spec/message.abnf | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spec/message.abnf b/spec/message.abnf index 81c10ee460..f0c62e10d1 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -56,10 +56,11 @@ unquoted-start = name-start / DIGIT / "." ; Reserve additional .keywords for use by future versions of this specification. +reserved-statement = reserved-keyword [s [reserved-body [s]]] 1*expression ; Note that the following expression is a simplification, -; as this rule MUST NOT be considered to match existing keywords: -; (input / local / match) (s / "{") -reserved-statement = "." reserved-body 1*expression +; as this rule MUST NOT be considered to match existing keywords. +; As regexp, this would be: /\.(?!input|local|match)[a-z]+/ +reserved-keyword = "." 1*(%x61-7A) ; Reserve additional sigils for use by future versions of this specification. reserved-annotation = reserved-annotation-start reserved-body From c73e72dfe8ff8dcf87c5f2cd73a20c892a56c82b Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Wed, 29 Nov 2023 01:21:39 +0200 Subject: [PATCH 11/11] Apply suggestions from code review Co-authored-by: Richard Gibson --- spec/message.abnf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/message.abnf b/spec/message.abnf index f0c62e10d1..ca139fd7b5 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -56,11 +56,11 @@ unquoted-start = name-start / DIGIT / "." ; Reserve additional .keywords for use by future versions of this specification. -reserved-statement = reserved-keyword [s [reserved-body [s]]] 1*expression +reserved-statement = reserved-keyword [s reserved-body] 1*([s] expression) ; Note that the following expression is a simplification, -; as this rule MUST NOT be considered to match existing keywords. -; As regexp, this would be: /\.(?!input|local|match)[a-z]+/ -reserved-keyword = "." 1*(%x61-7A) +; as this rule MUST NOT be considered to match existing keywords +; (`.input`, `.local`, and `.match`). +reserved-keyword = "." name ; Reserve additional sigils for use by future versions of this specification. reserved-annotation = reserved-annotation-start reserved-body