diff options
Diffstat (limited to 'doc')
-rwxr-xr-x | doc/grammar.txt | 29 | ||||
-rwxr-xr-x | doc/manual.txt | 66 |
2 files changed, 55 insertions, 40 deletions
diff --git a/doc/grammar.txt b/doc/grammar.txt index 4ab5845a8..837a93003 100755 --- a/doc/grammar.txt +++ b/doc/grammar.txt @@ -1,26 +1,27 @@ module ::= ([COMMENT] [SAD] stmt)* comma ::= ',' [COMMENT] [IND] -operator ::= OP0 | OR | XOR | AND | OP3 | OP4 | OP5 | OP6 | OP7 +operator ::= OP1 | OP2 | OP3 | OP4 | OP5 | OP6 | OP7 | OP8 | OP9 + | 'or' | 'xor' | 'and' | 'is' | 'isnot' | 'in' | 'notin' - | 'div' | 'mod' | 'shl' | 'shr' | 'not' + | 'div' | 'mod' | 'shl' | 'shr' | 'not' | '..' -prefixOperator ::= OP0 | OP3 | OP4 | OP5 | OP6 | OP7 | 'not' +prefixOperator ::= operator optInd ::= [COMMENT] [IND] optPar ::= [IND] | [SAD] -lowestExpr ::= otherExpr ('..' optInd otherExpr)* -otherExpr ::= orExpr (OP0 optInd orExpr)* -orExpr ::= andExpr (OR | 'xor' optInd andExpr)* -andExpr ::= cmpExpr ('and' optInd cmpExpr)* -cmpExpr ::= ampExpr (OP3 | 'is' | 'isnot' | 'in' | 'notin' optInd ampExpr)* -ampExpr ::= plusExpr (OP4 optInd plusExpr)* -plusExpr ::= mulExpr (OP5 optInd mulExpr)* -mulExpr ::= dollarExpr (OP6 | 'div' | 'mod' | 'shl' | 'shr' optInd dollarExpr)* -dollarExpr ::= primary (OP7 optInd primary)* +lowestExpr ::= orExpr (OP1 optInd orExpr)* +orExpr ::= andExpr (OP2 optInd andExpr)* +andExpr ::= cmpExpr (OP3 optInd cmpExpr)* +cmpExpr ::= sliceExpr (OP4 optInd sliceExpr)* +sliceExpr ::= ampExpr (OP5 optInd ampExpr)* +ampExpr ::= plusExpr (OP6 optInd plusExpr)* +plusExpr ::= mulExpr (OP7 optInd mulExpr)* +mulExpr ::= dollarExpr (OP8 optInd dollarExpr)* +dollarExpr ::= primary (OP9 optInd primary)* -indexExpr ::= '..' [expr] | expr ['=' expr] +indexExpr ::= expr ['=' expr] castExpr ::= 'cast' '[' optInd typeDesc optPar ']' '(' optInd expr optPar ')' addrExpr ::= 'addr' '(' optInd expr optPar ')' @@ -120,7 +121,7 @@ caseStmt ::= 'case' expr [':'] ('of' exprList ':' stmt)* ('elif' expr ':' stmt)* ['else' ':' stmt] whileStmt ::= 'while' expr ':' stmt -forStmt ::= 'for' symbol (comma symbol)* 'in' expr ['..' expr] ':' stmt +forStmt ::= 'for' symbol (comma symbol)* 'in' expr ':' stmt exceptList ::= [qualifiedIdent (comma qualifiedIdent)*] tryStmt ::= 'try' ':' stmt diff --git a/doc/manual.txt b/doc/manual.txt index f9c1fe333..e230861fb 100755 --- a/doc/manual.txt +++ b/doc/manual.txt @@ -346,29 +346,38 @@ notation: ``0B0_10001110100_0000101001000111101011101111111011000101001101001001'f64`` is approximately 1.72826e35 according to the IEEE floating point standard. + +Operators +--------- + +In Nimrod one can define his own operators. An `operator`:idx: is any +combination of the following characters:: + + = + - * / < > + @ $ ~ & % | + ! ? ^ . : \ +These keywords are also operators: +``and or not xor shl shr div mod in notin is isnot``. + +`=`:tok:, `:`:tok:, `::`:tok: are not available as general operators; they +are used for other notational purposes. + +``*:`` is as a special case the two tokens `*`:tok: and `:`:tok: +(to support ``var v*: T``). + Other tokens ------------ The following strings denote other tokens:: - ( ) { } [ ] , ; [. .] {. .} (. .) - : = ^ .. ` - -`..`:tok: takes precedence over other tokens that contain a dot: `{..}`:tok: are -the three tokens `{`:tok:, `..`:tok:, `}`:tok: and not the two tokens -`{.`:tok:, `.}`:tok:. - -In Nimrod one can define his own operators. An `operator`:idx: is any -combination of the following characters that is not listed above:: - - + - * / < > - = @ $ ~ & % - ! ? ^ . | \ - -These keywords are also operators: -``and or not xor shl shr div mod in notin is isnot``. + ` ( ) { } [ ] , ; [. .] {. .} (. .) + + +The `slice`:idx: operator `..`:tok: takes precedence over other tokens that +contain a dot: `{..}`:tok: are the three tokens `{`:tok:, `..`:tok:, `}`:tok: +and not the two tokens `{.`:tok:, `.}`:tok:. Syntax @@ -378,7 +387,7 @@ This section lists Nimrod's standard syntax in ENBF. How the parser receives indentation tokens is already described in the `Lexical Analysis`_ section. Nimrod allows user-definable operators. -Binary operators have 8 different levels of precedence. For user-defined +Binary operators have 9 different levels of precedence. For user-defined operators, the precedence depends on the first character the operator consists of. All binary operators are left-associative, except binary operators starting with (or only consisting of) ``^``. @@ -386,14 +395,15 @@ with (or only consisting of) ``^``. ================ ============================================== ================== =============== Precedence level Operators First characters Terminal symbol ================ ============================================== ================== =============== - 7 (highest) ``$ ^`` OP7 - 6 ``* / div mod shl shr %`` ``* % \ /`` OP6 - 5 ``+ -`` ``+ ~ |`` OP5 - 4 ``&`` ``&`` OP4 - 3 ``== <= < >= > != in not_in is isnot`` ``= < > !`` OP3 - 2 ``and`` OP2 - 1 ``or xor`` OP1 - 0 (lowest) ``? @ ` : .`` OP0 + 9 (highest) ``$ ^`` OP9 + 8 ``* / div mod shl shr %`` ``* % \ /`` OP8 + 7 ``+ -`` ``+ ~ |`` OP7 + 6 ``&`` ``&`` OP6 + 5 ``..`` ``.`` OP5 + 4 ``== <= < >= > != in not_in is isnot not`` ``= < > !`` OP4 + 3 ``and`` OP3 + 2 ``or xor`` OP2 + 1 (lowest) `` @ : ? `` OP1 ================ ============================================== ================== =============== @@ -2948,7 +2958,11 @@ string expressions in general: proc myImport(s: cstring) {.cdecl, importc, dynlib: getDllName().} **Note**: Patterns like ``libtcl(|8.5|8.4).so`` are only supported in constant -strings, because they are precompiled. +strings, because they are precompiled. + +**Note**: Passing variables to the ``dynlib`` pragma will fail at runtime +because of order of initialization problems. + Dynlib pragma for export ------------------------ |