From 62c0e8855440531faeafbdd1e0d1ff47102526da Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Tue, 6 Aug 2024 09:41:27 +0300 Subject: [PATCH] Allow whitespace at complex-message start --- spec/message.abnf | 4 ++-- spec/syntax.md | 13 +++++++++---- test/tests/syntax.json | 17 +++++++++++++---- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/spec/message.abnf b/spec/message.abnf index 583b680b8..1cd7a1fa5 100644 --- a/spec/message.abnf +++ b/spec/message.abnf @@ -1,11 +1,11 @@ message = simple-message / complex-message -simple-message = [simple-start pattern] +simple-message = [s] [simple-start pattern] simple-start = simple-start-char / escaped-char / placeholder pattern = *(text-char / escaped-char / placeholder) placeholder = expression / markup -complex-message = *(declaration [s]) complex-body [s] +complex-message = [s] *(declaration [s]) complex-body [s] declaration = input-declaration / local-declaration / reserved-statement complex-body = quoted-pattern / matcher diff --git a/spec/syntax.md b/spec/syntax.md index 6f7f7e9c6..6359e9c92 100644 --- a/spec/syntax.md +++ b/spec/syntax.md @@ -153,11 +153,14 @@ message = simple-message / complex-message ``` A **_simple message_** contains a single _pattern_, -with restrictions on its first character. +with restrictions on its first non-whitespace character. An empty string is a valid _simple message_. +Whitespace at the start of a _simple message_ is significant, +and a part of the _text_ of the _message_. + ```abnf -simple-message = [simple-start pattern] +simple-message = [s] [simple-start pattern] simple-start = simple-start-char / escaped-char / placeholder ``` @@ -169,8 +172,10 @@ and consists of: 1. an optional list of _declarations_, followed by 2. a _complex body_ +Whitespace at the start of a _complex message_ is ignored. + ```abnf -complex-message = *(declaration [s]) complex-body [s] +complex-message = [s] *(declaration [s]) complex-body [s] ``` ### Declarations @@ -300,7 +305,7 @@ U+007B LEFT CURLY BRACKET `{`, and U+007D RIGHT CURLY BRACKET `}` MUST be escaped as `\\`, `\{`, and `\}` respectively. In the ABNF, _text_ is represented by non-empty sequences of -`simple-start-char`, `text-char`, and `escaped-char`. +`simple-start-char`, `text-char`, `escaped-char`, and `s`. The first of these is used at the start of a _simple message_, and matches `text-char` except for not allowing U+002E FULL STOP `.`. The ABNF uses `content-char` as a shared base for _text_ and _quoted literal_ characters. diff --git a/test/tests/syntax.json b/test/tests/syntax.json index 9425b538b..1a2d601a2 100644 --- a/test/tests/syntax.json +++ b/test/tests/syntax.json @@ -36,6 +36,11 @@ "src": "hello {|world|}", "exp": "hello world" }, + { + "description": "message -> simple-message -> s simple-start pattern -> s simple-start-char pattern -> ...", + "src": "\n hello\t", + "exp": "\n hello\t" + }, { "src": "hello {$place}", "params": [ @@ -134,6 +139,11 @@ "src": ".input{$x}{{}}", "exp": "" }, + { + "description": "message -> complex-message -> s *(declaration [s]) complex-body s -> s declaration complex-body s -> s input-declaration complex-body s -> s input variable-expression complex-body s", + "src": "\t.input{$x}{{}}\n", + "exp": "" + }, { "description": "message -> complex-message -> *(declaration [s]) complex-body -> declaration declaration complex-body -> input-declaration input-declaration complex-body -> input variable-expression input variable-expression complex-body", "src": ".input{$x}.input{$y}{{}}", @@ -145,8 +155,8 @@ "exp": "" }, { - "description": "message -> complex-message -> *(declaration [s]) complex-body s -> complex-body s", - "src": "{{}} ", + "description": "message -> complex-message -> s *(declaration [s]) complex-body s -> s complex-body s", + "src": " {{}} ", "exp": "" }, { @@ -398,8 +408,7 @@ "source": "|42|", "value": "42" } - ], - "exp": "42" + ] }, { "description": "... literal -> quoted-literal -> \"|\" \"|\" ...",