summaryrefslogtreecommitdiff
path: root/chapter29/docs/29-grammar.md
diff options
context:
space:
mode:
Diffstat (limited to 'chapter29/docs/29-grammar.md')
-rw-r--r--chapter29/docs/29-grammar.md8
1 files changed, 7 insertions, 1 deletions
diff --git a/chapter29/docs/29-grammar.md b/chapter29/docs/29-grammar.md
index 58c9b30c..cb231ce0 100644
--- a/chapter29/docs/29-grammar.md
+++ b/chapter29/docs/29-grammar.md
@@ -47,7 +47,13 @@ structDeclaration : 'struct' IDENTIFIER '{' structMember* '}' ';' ;
structMember : constructorDeclaration | methodDeclaration | statement ;
// The constructor name must match the enclosing struct's name.
-constructorDeclaration : 'new' IDENTIFIER '=' functionExpression ';' ;
+constructorDeclaration : 'new' IDENTIFIER '=' constructorExpression ';' ;
+constructorExpression : '{' constructorParameterList? '->' statement* '}' ;
+constructorParameterList : (constructorParameter ','?)+ ;
+constructorParameter : type '^'? bindingModifier? IDENTIFIER ;
+// ^ accepts an unfinished struct reference; ? independently permits null.
+// Only self may be read while incomplete; ^ arguments may be stored/forwarded.
+// A new result is incomplete iff an actual argument is. See construction-groups.md.
// A method is an ordinary fixed function binding in a struct definition.
// The compiler supplies self; it is not written in parameterList.