Can we use parentheses in Swift grammar for grouping or is this prohibited for some reason? Could simplify quite a few things.
A few examples:
Current:
-
function-signature → parameter-clause
async
?throws
? function-result ? -
function-signature → parameter-clause
async
?rethrows
function-result ?
Simplified:
-
function-signature → parameter-clause
async
? (throws
? |rethrows
) function-result ?
Current:
- subscript-declaration → subscript-head subscript-result generic-where-clause ? code-block
- subscript-declaration → subscript-head subscript-result generic-where-clause ? getter-setter-block
- subscript-declaration → subscript-head subscript-result generic-where-clause ? getter-setter-keyword-block
Simplified:
- subscript-declaration → subscript-head subscript-result generic-where-clause ? ( code-block | getter-setter-block | getter-setter-keyword-block )
Current:
-
precedence-group-relation →
higherThan
:
precedence-group-names -
precedence-group-relation →
lowerThan
:
precedence-group-names
Simplified:
-
precedence-group-relation → (
higherThan
|lowerThan
):
precedence-group-names
Current:
-
precedence-group-associativity →
associativity
:
left
-
precedence-group-associativity →
associativity
:
right
-
precedence-group-associativity →
associativity
:
none
Simplified:
-
precedence-group-associativity →
associativity
:
(left
|right
|none
)
Current:
- variable-declaration → variable-declaration-head variable-name type-annotation code-block
- variable-declaration → variable-declaration-head variable-name type-annotation getter-setter-block
- variable-declaration → variable-declaration-head variable-name type-annotation getter-setter-keyword-block
Simplified:
- variable-declaration → variable-declaration-head variable-name type-annotation ( code-block | getter-setter-block | getter-setter-keyword-block )
Current:
-
access-level-modifier →
private
|private
(
set
)
-
access-level-modifier →
fileprivate
|fileprivate
(
set
)
-
access-level-modifier →
internal
|internal
(
set
)
-
access-level-modifier →
public
|public
(
set
)
-
access-level-modifier →
open
|open
(
set
)
Simplified:
-
access-level-modifier → (
private
|fileprivate
|internal
|public
|open
) ((
set
)
) ?
Alternatively:
-
access-level-suffix →
(
set
)
access-level-modifier → (private
|fileprivate
|internal
|public
|open
) access-level-suffix ?
Edit: italicised parens in BNF to make them more visually dissimilar to parens in the language – we do the same thing with question mark. Also added the alternative for the last example as discussed below.