app_0a.md 11 KB

Appendix A: Grammar The grammar’s start symbol is module. # This file is generated by compiler/parser.nim. module = complexOrSimpleStmt ^* (';' / IND{=}) comma = ',' COMMENT? semicolon = ';' COMMENT? colon = ':' COMMENT? colcom = ':' COMMENT? operator = OP0 | OP1 | OP2 | OP3 | OP4 | OP5 | OP6 | OP7 | OP8 | OP9

      | 'or' | 'xor' | 'and'
      | 'is' | 'isnot' | 'in' | 'notin' | 'of' | 'as' | 'from'
      | 'div' | 'mod' | 'shl' | 'shr' | 'not' | '..'

prefixOperator = operator optInd = COMMENT? IND? optPar = (IND{>} | IND{=})? simpleExpr = arrowExpr (OP0 optInd arrowExpr)* pragma? arrowExpr = assignExpr (OP1 optInd assignExpr)* assignExpr = orExpr (OP2 optInd orExpr)* orExpr = andExpr (OP3 optInd andExpr)* andExpr = cmpExpr (OP4 optInd cmpExpr)* cmpExpr = sliceExpr (OP5 optInd sliceExpr)* sliceExpr = ampExpr (OP6 optInd ampExpr)* ampExpr = plusExpr (OP7 optInd plusExpr)* plusExpr = mulExpr (OP8 optInd mulExpr)* mulExpr = dollarExpr (OP9 optInd dollarExpr)* dollarExpr = primary (OP10 optInd primary)* operatorB = OP0 | OP1 | OP2 | OP3 | OP4 | OP5 | OP6 | OP7 | OP8 | OP9 |

         'div' | 'mod' | 'shl' | 'shr' | 'in' | 'notin' |
         'is' | 'isnot' | 'not' | 'of' | 'as' | 'from' | '..' |
         'and' | 'or' | 'xor'

symbol = '' (KEYW|IDENT|literal|(operator|'('|')'|'['|']'|'{'|'}'|'=')+)+ ''

    | IDENT | 'addr' | 'type' | 'static'

symbolOrKeyword = symbol | KEYW exprColonEqExpr = expr ((':'|'=') expr

                    / doBlock extraPostExprBlock*)?

exprEqExpr = expr ('=' expr

                                                                       283
                 / doBlock extraPostExprBlock*)?

exprList = expr ^+ comma optionalExprList = expr ^* comma exprColonEqExprList = exprColonEqExpr (comma exprColonEqExpr)* (comma)? qualifiedIdent = symbol ('.' optInd symbolOrKeyword)? setOrTableConstr = '{' ((exprColonEqExpr comma)* | ':' ) '}' castExpr = 'cast' ('[' optInd typeDesc optPar ']' '(' optInd expr optPar ')') / parKeyw = 'discard' | 'include' | 'if' | 'while' | 'case' | 'try'

      | 'finally' | 'except' | 'for' | 'block' | 'const' | 'let'
      | 'when' | 'var' | 'mixin'

par = '(' optInd

        ( &parKeyw (ifExpr / complexOrSimpleStmt) ^+ ';'
        | ';' (ifExpr / complexOrSimpleStmt) ^+ ';'
        | pragmaStmt
        | simpleExpr ( (doBlock extraPostExprBlock*)
                      | ('=' expr (';' (ifExpr / complexOrSimpleStmt) ^+

';' )? )

                      | (':' expr (',' exprColonEqExpr     ^+ ',' )? ) ) )
        optPar ')'

literal = | INT_LIT | INT8_LIT | INT16_LIT | INT32_LIT | INT64_LIT

        | UINT_LIT | UINT8_LIT | UINT16_LIT | UINT32_LIT | UINT64_LIT
        | FLOAT_LIT | FLOAT32_LIT | FLOAT64_LIT
        | STR_LIT | RSTR_LIT | TRIPLESTR_LIT
        | CHAR_LIT | CUSTOM_NUMERIC_LIT
        | NIL

generalizedLit = GENERALIZED_STR_LIT | GENERALIZED_TRIPLESTR_LIT identOrLiteral = generalizedLit | symbol | literal

              | par | arrayConstr | setOrTableConstr | tupleConstr
              | castExpr

tupleConstr = '(' optInd (exprColonEqExpr comma?)* optPar ')' arrayConstr = '[' optInd (exprColonEqExpr comma?)* optPar ']' primarySuffix = '(' (exprColonEqExpr comma?)* ')'

    | '.' optInd symbolOrKeyword ('[:' exprList ']' ( '(' exprColonEqExpr

')' )?)? generalizedLit?

    | DOTLIKEOP optInd symbolOrKeyword generalizedLit?
    | '[' optInd exprColonEqExprList optPar ']'
    | '{' optInd exprColonEqExprList optPar '}'

pragma = '{.' optInd (exprColonEqExpr comma?)* optPar ('.}' | '}') identVis = symbol OPR? # postfix position identVisDot = symbol '.' optInd symbolOrKeyword OPR? identWithPragma = identVis pragma? identWithPragmaDot = identVisDot pragma? declColonEquals = identWithPragma (comma identWithPragma)* comma?

                 (':' optInd typeDescExpr)? ('=' optInd expr)?

identColonEquals = IDENT (comma IDENT)* comma?

  (':' optInd typeDescExpr)? ('=' optInd expr)?)

tupleTypeBracket = '[' optInd (identColonEquals (comma/semicolon)?)* optPar ']' tupleType = 'tuple' tupleTypeBracket tupleDecl = 'tuple' (tupleTypeBracket / 284

 COMMENT? (IND{>} identColonEquals (IND{=} identColonEquals)*)?)

paramList = '(' declColonEquals ^* (comma/semicolon) ')' paramListArrow = paramList? ('->' optInd typeDesc)? paramListColon = paramList? (':' optInd typeDesc)? doBlock = 'do' paramListArrow pragma? colcom stmt routineExpr = ('proc' | 'func' | 'iterator') paramListColon pragma? ('=' COMMENT? stmt)? routineType = ('proc' | 'iterator') paramListColon pragma? forStmt = 'for' ((varTuple / identWithPragma) ^+ comma) 'in' expr colcom stmt forExpr = forStmt expr = (blockExpr

   | ifExpr
   | whenExpr
   | caseStmt
   | forExpr
   | tryExpr)
   / simpleExpr

simplePrimary = SIGILLIKEOP? identOrLiteral primarySuffix* commandStart = &('`'|IDENT|literal|'cast'|'addr'|'type'|'var'|'out'|

               'static'|'enum'|'tuple'|'object'|'proc')

primary = simplePrimary (commandStart expr (doBlock extraPostExprBlock*)?)?

     / operatorB primary
     / routineExpr
     / rawTypeDesc
     / prefixOperator primary

rawTypeDesc = (tupleType | routineType | 'enum' | 'object' |

              ('var' | 'out' | 'ref' | 'ptr' | 'distinct') typeDesc?)
              ('not' primary)?

typeDescExpr = (routineType / simpleExpr) ('not' primary)? typeDesc = rawTypeDesc / typeDescExpr typeDefValue = ((tupleDecl | enumDecl | objectDecl | conceptDecl |

               ('ref' | 'ptr' | 'distinct') (tupleDecl | objectDecl))
             / (simpleExpr (exprEqExpr ^+ comma postExprBlocks?)?))
             ('not' primary)?

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?)

importStmt = 'import' optInd expr

            ((comma expr)*
            / 'except' optInd (expr ^+ comma))

exportStmt = 'export' optInd expr

            ((comma expr)*
                                                                      285
            / 'except' optInd (expr ^+ comma))

includeStmt = 'include' optInd expr ^+ comma fromStmt = 'from' expr 'import' optInd expr (comma expr)* returnStmt = 'return' optInd expr? raiseStmt = 'raise' optInd expr? yieldStmt = 'yield' optInd expr? discardStmt = 'discard' optInd expr? breakStmt = 'break' optInd expr? continueStmt = 'continue' optInd expr? condStmt = expr colcom stmt COMMENT?

         (IND{=} 'elif' expr colcom stmt)*
         (IND{=} 'else' colcom stmt)?

ifStmt = 'if' condStmt whenStmt = 'when' condStmt condExpr = expr colcom stmt optInd

      ('elif' expr colcom stmt optInd)*
       'else' colcom stmt

ifExpr = 'if' condExpr whenExpr = 'when' condExpr whileStmt = 'while' expr colcom stmt ofBranch = 'of' exprList colcom stmt ofBranches = ofBranch (IND{=} ofBranch)*

                    (IND{=} 'elif' expr colcom stmt)*
                    (IND{=} 'else' colcom stmt)?

caseStmt = 'case' expr ':'? COMMENT?

          (IND{>} ofBranches DED
          | IND{=} ofBranches)

tryStmt = 'try' colcom stmt &(IND{=}? 'except'|'finally')

         (IND{=}? 'except' optionalExprList colcom stmt)*
         (IND{=}? 'finally' colcom stmt)?

tryExpr = 'try' colcom stmt &(optInd 'except'|'finally')

         (optInd 'except' optionalExprList colcom stmt)*
         (optInd 'finally' colcom stmt)?

blockStmt = 'block' symbol? colcom stmt blockExpr = 'block' symbol? colcom stmt staticStmt = 'static' colcom stmt deferStmt = 'defer' colcom stmt asmStmt = 'asm' pragma? (STR_LIT | RSTR_LIT | TRIPLESTR_LIT) genericParam = symbol (comma symbol)* (colon expr)? ('=' optInd expr)? genericParamList = '[' optInd genericParam ^* (comma/semicolon) optPar ']' pattern = '{' stmt '}' indAndComment = (IND{>} COMMENT)? | COMMENT? routine = optInd identVis pattern? genericParamList? paramListColon pragma? ('=' COMMENT? stmt)? indAndComment commentStmt = COMMENT section(RULE) = COMMENT? RULE / (IND{>} (RULE / COMMENT)^+IND{=} DED) enumDecl = 'enum' optInd (symbol pragma? optInd ('=' optInd expr COMMENT?)? comma?)+ objectWhen = 'when' expr colcom objectPart COMMENT?

          ('elif' expr colcom objectPart COMMENT?)*

286

         ('else' colcom objectPart COMMENT?)?

objectBranch = 'of' exprList colcom objectPart objectBranches = objectBranch (IND{=} objectBranch)*

                   (IND{=} 'elif' expr colcom objectPart)*
                   (IND{=} 'else' colcom objectPart)?

objectCase = 'case' declColonEquals ':'? COMMENT?

         (IND{>} objectBranches DED
         | IND{=} objectBranches)

objectPart = IND{>} objectPart^+IND{=} DED

        / objectWhen / objectCase / 'nil' / 'discard' / declColonEquals

objectDecl = 'object' ('of' typeDesc)? COMMENT? objectPart conceptParam = ('var' | 'out')? symbol conceptDecl = 'concept' conceptParam ^* ',' (pragma)? ('of' typeDesc ^* ',')?

           &IND{>} stmt

typeDef = identVisDot genericParamList? pragma '=' optInd typeDefValue

         indAndComment?

varTupleLhs = '(' optInd (identWithPragma / varTupleLhs) ^+ comma optPar ')' varTuple = varTupleLhs '=' optInd expr colonBody = colcom stmt postExprBlocks? variable = (varTuple / identColonEquals) colonBody? indAndComment constant = (varTuple / identWithPragma) (colon typeDesc)? '=' optInd expr indAndComment bindStmt = 'bind' optInd qualifiedIdent ^+ comma mixinStmt = 'mixin' optInd qualifiedIdent ^+ comma pragmaStmt = pragma (':' COMMENT? stmt)? simpleStmt = ((returnStmt | raiseStmt | yieldStmt | discardStmt | breakStmt

        | continueStmt | pragmaStmt | importStmt | exportStmt | fromStmt
        | includeStmt | commentStmt) / exprStmt) COMMENT?

complexOrSimpleStmt = (ifStmt | whenStmt | whileStmt

                 | tryStmt | forStmt
                 | blockStmt | staticStmt | deferStmt | asmStmt
                 | 'proc' routine
                 | 'method' routine
                 | 'func' routine
                 | 'iterator' routine
                 | 'macro' routine
                 | 'template' routine
                 | 'converter' routine
                 | 'type' section(typeDef)
                 | 'const' section(constant)
                 | ('let' | 'var' | 'using') section(variable)
                 | bindStmt | mixinStmt)
                 / simpleStmt

stmt = (IND{>} complexOrSimpleStmt^+(IND{=} / ';') DED)

  / simpleStmt ^+ ';'