From 729dbaceec9a03fbd01e21c05b5e8f5011544636 Mon Sep 17 00:00:00 2001 From: Alessandro Coglio Date: Wed, 16 Mar 2022 20:40:06 -0700 Subject: [PATCH] [ABNF] Allow trailing commas everywhere. Also disallow 1-tuple array dimensions. --- docs/grammar/README.md | 26 ++++++++++++++------------ docs/grammar/abnf-grammar.txt | 26 ++++++++++++++------------ 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/docs/grammar/README.md b/docs/grammar/README.md index b9934a9b39..02f9182ae6 100644 --- a/docs/grammar/README.md +++ b/docs/grammar/README.md @@ -993,7 +993,7 @@ A tuple type consists of zero, two, or more component types. ```abnf -tuple-type = "(" [ type 1*( "," type ) ] ")" +tuple-type = "(" [ type 1*( "," type ) [ "," ] ] ")" ``` Go to: _[type](#user-content-type)_; @@ -1002,7 +1002,7 @@ Go to: _[type](#user-content-type)_; An array type consists of an element type and an indication of dimensions. There is either a single dimension, -or a tuple of one or more dimensions. +or a tuple of two or more dimensions. Each dimension is a numeral. @@ -1015,7 +1015,7 @@ Go to: _[array-dimensions](#user-content-array-dimensions), [type](#user-content ```abnf -array-dimensions = numeral / "(" numeral *( "," numeral ) ")" +array-dimensions = numeral / "(" numeral 1*( "," numeral ) [ "," ] ")" ``` Go to: _[numeral](#user-content-numeral)_; @@ -1152,7 +1152,7 @@ Each consists of zero, two, or more component expressions. ```abnf -tuple-construction = "(" [ expression 1*( "," expression ) ] ")" +tuple-construction = "(" [ expression 1*( "," expression ) [ "," ] ] ")" ``` Go to: _[expression](#user-content-expression)_; @@ -1178,6 +1178,7 @@ across one or more dimensions. array-inline-construction = "[" array-inline-element *( "," array-inline-element ) + [ "," ] "]" ``` @@ -1279,7 +1280,7 @@ as static constants are associated to named types. ```abnf -function-arguments = "(" [ expression *( "," expression ) ] ")" +function-arguments = "(" [ expression *( "," expression ) [ "," ] ] ")" ``` Go to: _[expression](#user-content-expression)_; @@ -1502,7 +1503,7 @@ Go to: _[expression](#user-content-expression), [identifier-or-identifiers](#use ```abnf identifier-or-identifiers = identifier - / "(" identifier 1*( "," identifier ) ")" + / "(" identifier 1*( "," identifier ) [ "," ] ")" ``` Go to: _[identifier](#user-content-identifier)_; @@ -1605,7 +1606,7 @@ print-function = %s"error" / %s"log" ```abnf -print-arguments = "(" string-literal *( "," expression ) ")" +print-arguments = "(" string-literal *( "," expression ) [ "," ] ")" ``` Go to: _[string-literal](#user-content-string-literal)_; @@ -1625,7 +1626,7 @@ with optional annotation arguments, which are identifiers. ```abnf annotation = annotation-name - [ "(" *( identifier "," ) [ identifier ] ")" ] + [ "(" [ identifier *( "," identifier ) [ "," ] ] ")" ] ``` Go to: _[annotation-name](#user-content-annotation-name), [identifier](#user-content-identifier)_; @@ -1650,7 +1651,7 @@ Go to: _[block](#user-content-block), [function-parameters](#user-content-functi ```abnf -function-parameters = self-parameter +function-parameters = self-parameter [ "," ] / self-parameter "," function-inputs / function-inputs ``` @@ -1665,7 +1666,7 @@ self-parameter = [ %s"&" / %s"const" ] %s"self" ```abnf -function-inputs = function-input *( "," function-input ) +function-inputs = function-input *( "," function-input ) [ "," ] ``` Go to: _[function-input](#user-content-function-input)_; @@ -1706,8 +1707,9 @@ see the rule `circuit-declaration`. ```abnf -member-variable-declarations = *( identifier ":" type ( "," / ";" ) ) - identifier ":" type ( [ "," ] / ";" ) +member-variable-declarations = identifier ":" type + *( ( "," / ";" ) identifier ":" type ) + [ "," / ";" ] ``` Go to: _[identifier](#user-content-identifier), [type](#user-content-type)_; diff --git a/docs/grammar/abnf-grammar.txt b/docs/grammar/abnf-grammar.txt index a9090600bb..b2acfeea6b 100644 --- a/docs/grammar/abnf-grammar.txt +++ b/docs/grammar/abnf-grammar.txt @@ -640,17 +640,17 @@ scalar-type = boolean-type / arithmetic-type / address-type / character-type ; A tuple type consists of zero, two, or more component types. -tuple-type = "(" [ type 1*( "," type ) ] ")" +tuple-type = "(" [ type 1*( "," type ) [ "," ] ] ")" ; An array type consists of an element type ; and an indication of dimensions. ; There is either a single dimension, -; or a tuple of one or more dimensions. +; or a tuple of two or more dimensions. ; Each dimension is a numeral. array-type = "[" type ";" array-dimensions "]" -array-dimensions = numeral / "(" numeral *( "," numeral ) ")" +array-dimensions = numeral / "(" numeral 1*( "," numeral ) [ "," ] ")" ; The keyword `Self` denotes the enclosing circuit type. ; It is only allowed inside a circuit type declaration. @@ -730,7 +730,7 @@ primary-expression = identifier ; Tuple expressions construct tuples. ; Each consists of zero, two, or more component expressions. -tuple-construction = "(" [ expression 1*( "," expression ) ] ")" +tuple-construction = "(" [ expression 1*( "," expression ) [ "," ] ] ")" tuple-expression = tuple-construction @@ -744,6 +744,7 @@ tuple-expression = tuple-construction array-inline-construction = "[" array-inline-element *( "," array-inline-element ) + [ "," ] "]" array-inline-element = expression / "..." expression @@ -797,7 +798,7 @@ circuit-expression = circuit-construction ; They consist of a named type followed by the constant name, ; as static constants are associated to named types. -function-arguments = "(" [ expression *( "," expression ) ] ")" +function-arguments = "(" [ expression *( "," expression ) [ "," ] ] ")" postfix-expression = primary-expression / postfix-expression "." numeral @@ -915,7 +916,7 @@ constant-declaration = %s"const" identifier-or-identifiers ":" type "=" expression ";" identifier-or-identifiers = identifier - / "(" identifier 1*( "," identifier ) ")" + / "(" identifier 1*( "," identifier ) [ "," ] ")" ; A conditional statement always starts with a condition and a block ; (which together form a branch). @@ -964,7 +965,7 @@ assert-call = %s"assert" "(" expression ")" print-function = %s"error" / %s"log" -print-arguments = "(" string-literal *( "," expression ) ")" +print-arguments = "(" string-literal *( "," expression ) [ "," ] ")" print-call = print-function print-arguments @@ -972,7 +973,7 @@ print-call = print-function print-arguments ; with optional annotation arguments, which are identifiers. annotation = annotation-name - [ "(" *( identifier "," ) [ identifier ] ")" ] + [ "(" [ identifier *( "," identifier ) [ "," ] ] ")" ] ; A function declaration defines a function. ; The output type is optional, defaulting to the empty tuple type. @@ -985,13 +986,13 @@ function-declaration = *annotation [ %s"const" ] %s"function" identifier "(" [ function-parameters ] ")" [ "->" type ] block -function-parameters = self-parameter +function-parameters = self-parameter [ "," ] / self-parameter "," function-inputs / function-inputs self-parameter = [ %s"&" / %s"const" ] %s"self" -function-inputs = function-input *( "," function-input ) +function-inputs = function-input *( "," function-input ) [ "," ] function-input = [ %s"const" ] identifier ":" type @@ -1014,8 +1015,9 @@ member-constant-declaration = %s"static" %s"const" identifier ":" type ; but instead one for a sequence of them; ; see the rule `circuit-declaration`. -member-variable-declarations = *( identifier ":" type ( "," / ";" ) ) - identifier ":" type ( [ "," ] / ";" ) +member-variable-declarations = identifier ":" type + *( ( "," / ";" ) identifier ":" type ) + [ "," / ";" ] ; A circuit member function declaration consists of a function declaration.