summary refs log tree commit diff stats
path: root/doc
diff options
context:
space:
mode:
authormetagn <metagngn@gmail.com>2023-06-06 07:53:21 +0300
committerGitHub <noreply@github.com>2023-06-06 06:53:21 +0200
commit2ab948ce53e3d9b80bf9b02644c8ec8991f34d0a (patch)
tree0382d24fc7fd4c09397bc56bf7dccc7ba5b19e42 /doc
parent0a212f97a5dd4d5dd1ea84f370bd27abe55a818e (diff)
downloadNim-2ab948ce53e3d9b80bf9b02644c8ec8991f34d0a.tar.gz
post expr blocks colon fix + correct grammar (#21983)
* post expr blocks colon fix + correct grammar

fixes #21982

* fix dochelpers

* this is remarkably common

* use head for unchained

* fix atlas

* final grammar fix
Diffstat (limited to 'doc')
-rw-r--r--doc/grammar.txt26
1 files changed, 15 insertions, 11 deletions
diff --git a/doc/grammar.txt b/doc/grammar.txt
index 89095d65c..e498dd2b2 100644
--- a/doc/grammar.txt
+++ b/doc/grammar.txt
@@ -28,8 +28,10 @@ operatorB = OP0 | OP1 | OP2 | OP3 | OP4 | OP5 | OP6 | OP7 | OP8 | OP9 |
 symbol = '`' (KEYW|IDENT|literal|(operator|'('|')'|'['|']'|'{'|'}'|'=')+)+ '`'
        | IDENT | 'addr' | 'type' | 'static'
 symbolOrKeyword = symbol | KEYW
-exprColonEqExpr = expr (':'|'=' expr)?
-exprEqExpr = expr ('=' expr)?
+exprColonEqExpr = expr ((':'|'=') expr
+                       / doBlock extraPostExprBlock*)?
+exprEqExpr = expr ('=' expr
+                  / doBlock extraPostExprBlock*)?
 exprList = expr ^+ comma
 optionalExprList = expr ^* comma
 exprColonEqExprList = exprColonEqExpr (comma exprColonEqExpr)* (comma)?
@@ -43,7 +45,8 @@ par = '(' optInd
           ( &parKeyw (ifExpr / complexOrSimpleStmt) ^+ ';'
           | ';' (ifExpr / complexOrSimpleStmt) ^+ ';'
           | pragmaStmt
-          | simpleExpr ( ('=' expr (';' (ifExpr / complexOrSimpleStmt) ^+ ';' )? )
+          | simpleExpr ( (doBlock extraPostExprBlock*)
+                       | ('=' expr (';' (ifExpr / complexOrSimpleStmt) ^+ ';' )? )
                        | (':' expr (',' exprColonEqExpr     ^+ ',' )? ) ) )
           optPar ')'
 literal = | INT_LIT | INT8_LIT | INT16_LIT | INT32_LIT | INT64_LIT
@@ -94,7 +97,7 @@ expr = (blockExpr
 simplePrimary = SIGILLIKEOP? identOrLiteral primarySuffix*
 commandStart = &('`'|IDENT|literal|'cast'|'addr'|'type'|'var'|'out'|
                  'static'|'enum'|'tuple'|'object'|'proc')
-primary = simplePrimary (commandStart expr)
+primary = simplePrimary (commandStart expr (doBlock extraPostExprBlock*)?)?
         / operatorB primary
         / routineExpr
         / rawTypeDesc
@@ -106,14 +109,15 @@ typeDescExpr = (routineType / simpleExpr) ('not' expr)?
 typeDesc = rawTypeDesc / typeDescExpr
 typeDefValue = ((tupleDecl | enumDecl | objectDecl | conceptDecl |
                  ('ref' | 'ptr' | 'distinct') (tupleDecl | objectDecl))
-               / (simpleExpr (exprEqExpr ^+ comma postExprBlocks)?))
+               / (simpleExpr (exprEqExpr ^+ comma postExprBlocks?)?))
                ('not' expr)?
-postExprBlocks = ':' stmt? ( IND{=} doBlock
-                           | IND{=} 'of' exprList ':' stmt
-                           | IND{=} 'elif' expr ':' stmt
-                           | IND{=} 'except' optionalExprList ':' stmt
-                           | IND{=} 'finally' ':' stmt
-                           | IND{=} 'else' ':' stmt )*
+extraPostExprBlock = ( IND{=} doBlock
+                     | IND{=} 'of' exprList ':' stmt
+                     | IND{=} 'elif' expr ':' stmt
+                     | IND{=} 'except' optionalExprList ':' stmt
+                     | IND{=} 'finally' ':' stmt
+                     | IND{=} 'else' ':' stmt )
+postExprBlocks = (doBlock / ':' (extraPostExprBlock / stmt)) extraPostExprBlock*
 exprStmt = simpleExpr postExprBlocks?
          / simplePrimary (exprEqExpr ^+ comma) postExprBlocks?
          / simpleExpr '=' optInd (expr postExprBlocks?)