diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2015-06-18 13:39:07 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2015-06-18 13:39:07 +0200 |
commit | bd394eaeda9bcd57daae92520d933676dc6573b9 (patch) | |
tree | b2e4c8fb1ed002e709a70bbe5c669aede25dd27b /doc/astspec.txt | |
parent | 6f1cc914c5a81f3f75556f67af497a373c143fe9 (diff) | |
parent | 137c836616f471abdcfafc21376ee5a5f65efc08 (diff) | |
download | Nim-bd394eaeda9bcd57daae92520d933676dc6573b9.tar.gz |
Merge pull request #2954 from avsej/fix-rest-syntax-in-astspec
Fix rest syntax in astspec
Diffstat (limited to 'doc/astspec.txt')
-rw-r--r-- | doc/astspec.txt | 118 |
1 files changed, 59 insertions, 59 deletions
diff --git a/doc/astspec.txt b/doc/astspec.txt index ebc39322f..797413bd0 100644 --- a/doc/astspec.txt +++ b/doc/astspec.txt @@ -40,16 +40,16 @@ For the ``NimNode`` type, the ``[]`` operator has been overloaded: ``n[i]`` is ``n``'s ``i``-th child. To specify the AST for the different Nim constructs, the notation -``nodekind(son1, son2, ...)`` or ``nodekind(value)`` or +``nodekind(son1, son2, ...)`` or ``nodekind(value)`` or ``nodekind(field=value)`` is used. -Some child may be missing. A missing child is a node of kind ``nnkEmpty``; +Some child may be missing. A missing child is a node of kind ``nnkEmpty``; a child can never be nil. Leaf nodes/Atoms ================ -A leaf of the AST often corresponds to a terminal symbol in the concrete +A leaf of the AST often corresponds to a terminal symbol in the concrete syntax. ----------------- --------------------------------------------- @@ -95,8 +95,8 @@ AST: .. code-block:: nim nnkCommand( - nnkIdent(!"echo"), - nnkStrLit("abc"), + nnkIdent(!"echo"), + nnkStrLit("abc"), nnkStrLit("xyz") ) @@ -113,8 +113,8 @@ AST: .. code-block:: nim nnkCall( - nnkIdent(!"echo"), - nnkStrLit("abc"), + nnkIdent(!"echo"), + nnkStrLit("abc"), nnkStrLit("xyz") ) @@ -131,12 +131,12 @@ AST: .. code-block:: nim nnkInfix( - nnkIdent(!"&"), - nnkStrLit("abc"), + nnkIdent(!"&"), + nnkStrLit("abc"), nnkStrLit("xyz") ) -Note that with multiple infix operators, the command is parsed by operator +Note that with multiple infix operators, the command is parsed by operator precedence. Concrete syntax: @@ -148,18 +148,18 @@ AST: .. code-block:: nim nnkInfix( - nnkIdent(!"+"), + nnkIdent(!"+"), nnkIntLit(5), nnkInfix( - nnkIdent(!"*"), - nnkIntLit(3), + nnkIdent(!"*"), + nnkIntLit(3), nnkIntLit(4) ) ) -As a side note, if you choose to use infix operators in a prefix form, the AST -behaves as a -[parenthetical function call](./macros.html#calls-expressions-call-with) with +As a side note, if you choose to use infix operators in a prefix form, the AST +behaves as a +[parenthetical function call](./macros.html#calls-expressions-call-with) with ``nnkAccQuoted``, as follows: Concrete syntax: @@ -173,8 +173,8 @@ AST: nnkCall( nnkAccQuoted( nnkIdent(!"+") - ), - nnkIntLit(3), + ), + nnkIntLit(3), nnkIntLit(4) ) @@ -190,7 +190,7 @@ AST: .. code-block:: nim nnkPrefix( - nnkIdent(!"?"), + nnkIdent(!"?"), nnkStrLit("abc") ) @@ -198,7 +198,7 @@ AST: Postfix operator call --------------------- -**Note:** There are no postfix operators in Nim. However, the +**Note:** There are no postfix operators in Nim. However, the ``nnkPostfix`` node is used for the *asterisk export marker* ``*``: Concrete syntax: @@ -210,7 +210,7 @@ AST: .. code-block:: nim nnkPostfix( - nnkIdent(!"*"), + nnkIdent(!"*"), nnkIdent(!"identifier") ) @@ -227,11 +227,11 @@ AST: .. code-block:: nim nnkCall( - nnkIdent(!"writeln"), + nnkIdent(!"writeln"), nnkExprEqExpr( - nnkIdent(!"file"), + nnkIdent(!"file"), nnkIdent(!"stdout") - ), + ), nnkStrLit("hallo") ) @@ -310,7 +310,7 @@ AST: .. code-block:: nim nnkDotExpr(nnkIdent(!"x"), nnkIdent(!"y")) -If you use Nim's flexible calling syntax (as in ``x.len()``), the result is the +If you use Nim's flexible calling syntax (as in ``x.len()``), the result is the same as above but wrapped in an ``nnkCall``. @@ -331,7 +331,7 @@ AST: Parentheses ----------- -Parentheses for affecting operator precedence or tuple construction +Parentheses for affecting operator precedence or tuple construction are built with the ``nnkPar`` node. Concrete syntax: @@ -343,12 +343,12 @@ AST: .. code-block:: nim nnkPar(nnkIntLit(1), nnkIntLit(2), nnkPar(nnkIntLit(3))) - - + + Curly braces ------------ -Curly braces are used as the set constructor. +Curly braces are used as the set constructor. Concrete syntax: @@ -379,7 +379,7 @@ AST: Brackets -------- -Brackets are used as the array constructor. +Brackets are used as the array constructor. Concrete syntax: @@ -430,8 +430,8 @@ AST: Documentation Comments ---------------------- -Double-hash (``##``) comments in the code actually have their own format, -but the comments do not yet show up in the AST, which will only show that +Double-hash (``##``) comments in the code actually have their own format, +but the comments do not yet show up in the AST, which will only show that a comment exists, not what it contains. Single-hash (``#``) comments are ignored. Concrete syntax: @@ -447,14 +447,14 @@ AST: .. code-block:: nim nnkCommentStmt() # only appears once for the first two lines! stmt1 - nnkCommentStmt() # another nnkCommentStmt because there is another comment + nnkCommentStmt() # another nnkCommentStmt because there is another comment # (separate from the first) Pragmas ------- One of Nim's cool features is pragmas, which allow fine-tuning of various -aspects of the language. They come in all types, such as adorning procs and +aspects of the language. They come in all types, such as adorning procs and objects, but the standalone ``emit`` pragma shows the basics with the AST. Concrete syntax: @@ -503,7 +503,7 @@ there is no ``else`` branch, no ``nnkElse`` child exists. Concrete syntax: .. code-block:: nim - if cond1: + if cond1: stmt1 elif cond2: stmt2 @@ -560,7 +560,7 @@ AST: .. code-block:: nim nnkStmtList(stmt1, stmt2, stmt3) - + Case statement -------------- @@ -568,7 +568,7 @@ Concrete syntax: .. code-block:: nim case expr1 - of expr2, expr3..expr4: + of expr2, expr3..expr4: stmt1 of expr5: stmt2 @@ -629,11 +629,11 @@ Concrete syntax: .. code-block:: nim try: stmt1 - except e1, e2: + except e1, e2: stmt2 except e3: stmt3 - except: + except: stmt4 finally: stmt5 @@ -642,9 +642,9 @@ AST: .. code-block:: nim nnkTryStmt( - stmt1, - nnkExceptBranch(e1, e2, stmt2), - nnkExceptBranch(e3, stmt3), + stmt1, + nnkExceptBranch(e1, e2, stmt2), + nnkExceptBranch(e3, stmt3), nnkExceptBranch(stmt4), nnkFinally(stmt5) ) @@ -875,8 +875,8 @@ Note that either the second or third (or both) parameters above must exist, as the compiler needs to know the type somehow (which it can infer from the given assignment). -This is not the same AST for all uses of ``var``. See -[Procedure declaration](http://nim-lang.org/docs/macros.html#statements-procedure-declaration) +This is not the same AST for all uses of ``var``. See +[Procedure declaration](http://nim-lang.org/docs/macros.html#statements-procedure-declaration) for details. Let section @@ -921,7 +921,7 @@ AST: Type section ------------ -Starting with the simplest case, a ``type`` section appears much like ``var`` +Starting with the simplest case, a ``type`` section appears much like ``var`` and ``const``. Concrete syntax: @@ -976,7 +976,7 @@ AST: nnkGenericParams( nnkIdentDefs( nnkIdent(!"T"), - nnkEmpty(), # if the type is declared with options, like + nnkEmpty(), # if the type is declared with options, like # ``[T: SomeInteger]``, they are given here nnkEmpty(), ) @@ -1113,7 +1113,7 @@ AST: # ... ) -Static types, like ``static[int]``, use ``nnkIdent`` wrapped in +Static types, like ``static[int]``, use ``nnkIdent`` wrapped in ``nnkStaticTy``. Concrete syntax: @@ -1153,7 +1153,7 @@ Nim type Corresponding AST ``iterator`` ``nnkIteratorTy`` ``object`` ``nnkObjectTy`` -Take special care when declaring types as ``proc``s. The behavior is similar +Take special care when declaring types as ``proc``. The behavior is similar to ``Procedure declaration``, below, but does not treat ``nnkGenericParams``. Generic parameters are treated in the type, not the ``proc`` itself. @@ -1178,8 +1178,8 @@ AST: ) ) -The same syntax applies to ``iterator``s (with ``nnkIteratorTy``), but -*does not* apply to ``converter``s or ``template``s. +The same syntax applies to ``iterator`` (with ``nnkIteratorTy``), but +*does not* apply to ``converter`` or ``template``. Mixin statement --------------- @@ -1232,13 +1232,13 @@ AST: nnkFormalParams( nnkIdent(!"int"), # the first FormalParam is the return type. nnkEmpty() if there is none nnkIdentDefs( - nnkIdent(!"x"), + nnkIdent(!"x"), nnkIdent(!"int"), # type type (required for procs, not for templates) nnkIntLit(3) # a default value ), nnkIdentDefs( - nnkIdent(!"y"), - nnkIdent(!"float32"), + nnkIdent(!"y"), + nnkIdent(!"float32"), nnkEmpty() ) nnkPragma(nnkIdent(!"inline")), @@ -1271,7 +1271,7 @@ AST: ), # ... -When a procedure uses the special ``var`` type return variable, the result +When a procedure uses the special ``var`` type return variable, the result is different from that of a var section. Concrete syntax: @@ -1292,7 +1292,7 @@ AST: Iterator declaration -------------------- -The syntax for iterators is similar to procs, but with ``nnkIteratorDef`` +The syntax for iterators is similar to procs, but with ``nnkIteratorDef`` replacing ``nnkProcDef``. Concrete syntax: @@ -1333,7 +1333,7 @@ Template declaration Templates (as well as macros, as we'll see) have a slightly expanded AST when compared to procs and iterators. The reason for this is [term-rewriting macros](http://nim-lang.org/docs/manual.html#term-rewriting-macros). Notice -the ``nnkEmpty()`` as the second argument to ``nnkProcDef`` and +the ``nnkEmpty()`` as the second argument to ``nnkProcDef`` and ``nnkIteratorDef`` above? That's where the term-rewriting macros go. Concrete syntax: @@ -1358,16 +1358,16 @@ inside ``nnkFormalParams`` just becomes ``nnkEmpty``. Macro declaration ----------------- -Macros behave like templates, but ``nnkTemplateDef`` is replaced with +Macros behave like templates, but ``nnkTemplateDef`` is replaced with ``nnkMacroDef``. Special node kinds ================== -There are several node kinds that are used for semantic checking or code +There are several node kinds that are used for semantic checking or code generation. These are accessible from this module, but should not be used. Other node kinds are especially designed to make AST manipulations easier. -These are explained here. +These are explained here. To be written. |