mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 01:14:41 +00:00
196 lines
8.3 KiB
Plaintext
196 lines
8.3 KiB
Plaintext
module = stmt ^* (';' / 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'
|
|
| 'div' | 'mod' | 'shl' | 'shr' | 'not' | 'addr' | 'static' | '..'
|
|
|
|
prefixOperator = operator
|
|
|
|
optInd = COMMENT?
|
|
optPar = (IND{>} | IND{=})?
|
|
|
|
simpleExpr = assignExpr (OP0 optInd assignExpr)*
|
|
assignExpr = 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)*
|
|
symbol = '`' (KEYW|IDENT|operator|'(' ')'|'[' ']'|'{' '}'|'='|literal)+ '`'
|
|
| IDENT
|
|
indexExpr = expr
|
|
indexExprList = indexExpr ^+ comma
|
|
exprColonEqExpr = expr (':'|'=' expr)?
|
|
exprList = expr ^+ comma
|
|
dotExpr = expr '.' optInd ('type' | 'addr' | symbol)
|
|
qualifiedIdent = symbol ('.' optInd ('type' | 'addr' | symbol))?
|
|
exprColonEqExprList = exprColonEqExpr (comma exprColonEqExpr)* (comma)?
|
|
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 complexOrSimpleStmt ^+ ';'
|
|
| simpleExpr ('=' expr (';' complexOrSimpleStmt ^+ ';' )? )?
|
|
| (':' expr)? (',' (exprColonEqExpr comma?)*)? )?
|
|
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
|
|
| NIL
|
|
generalizedLit = GENERALIZED_STR_LIT | GENERALIZED_TRIPLESTR_LIT
|
|
identOrLiteral = generalizedLit | symbol | literal
|
|
| par | arrayConstr | setOrTableConstr
|
|
| castExpr
|
|
tupleConstr = '(' optInd (exprColonEqExpr comma?)* optPar ')'
|
|
arrayConstr = '[' optInd (exprColonEqExpr comma?)* optPar ']'
|
|
primarySuffix = '(' (exprColonEqExpr comma?)* ')' doBlocks?
|
|
| doBlocks
|
|
| '.' optInd ('type' | 'addr' | symbol) generalizedLit?
|
|
| '[' optInd indexExprList optPar ']'
|
|
| '{' optInd indexExprList optPar '}'
|
|
| &( '`'|IDENT|literal|'cast') expr # command syntax
|
|
condExpr = expr colcom expr optInd
|
|
('elif' expr colcom expr optInd)*
|
|
'else' colcom expr
|
|
ifExpr = 'if' condExpr
|
|
whenExpr = 'when' condExpr
|
|
pragma = '{.' optInd (exprColonExpr comma?)* optPar ('.}' | '}')
|
|
identVis = symbol opr? # postfix position
|
|
identWithPragma = identVis pragma?
|
|
declColonEquals = identWithPragma (comma identWithPragma)* comma?
|
|
(':' optInd typeDesc)? ('=' optInd expr)?
|
|
identColonEquals = ident (comma ident)* comma?
|
|
(':' optInd typeDesc)? ('=' optInd expr)?)
|
|
inlTupleDecl = 'tuple'
|
|
[' optInd (identColonEquals (comma/semicolon)?)* optPar ']'
|
|
extTupleDecl = 'tuple'
|
|
COMMENT? (IND{>} identColonEquals (IND{=} identColonEquals)*)?
|
|
paramList = '(' declColonEquals ^* (comma/semicolon) ')'
|
|
paramListArrow = paramList? ('->' optInd typeDesc)?
|
|
paramListColon = paramList? (':' optInd typeDesc)?
|
|
doBlock = 'do' paramListArrow pragmas? colcom stmt
|
|
doBlocks = doBlock ^* IND{=}
|
|
procExpr = 'proc' paramListColon pragmas? ('=' COMMENT? stmt)?
|
|
expr = (ifExpr
|
|
| whenExpr
|
|
| caseExpr
|
|
| tryStmt)
|
|
/ simpleExpr
|
|
typeKeyw = 'var' | 'ref' | 'ptr' | 'shared' | 'type' | 'tuple'
|
|
| 'proc' | 'iterator' | 'distinct' | 'object' | 'enum'
|
|
primary = typeKeyw typeDescK
|
|
/ prefixOperator* identOrLiteral primarySuffix*
|
|
/ 'addr' primary
|
|
/ 'static' primary
|
|
/ 'bind' primary
|
|
typeDesc = simpleExpr
|
|
typeDefAux = simpleExpr
|
|
| 'generic' typeClass
|
|
macroColon = ':' stmt? ( IND{=} 'of' exprList ':' stmt
|
|
| IND{=} 'elif' expr ':' stmt
|
|
| IND{=} 'except' exprList ':' stmt
|
|
| IND{=} 'else' ':' stmt )*
|
|
exprStmt = simpleExpr
|
|
(( '=' optInd expr )
|
|
/ ( expr ^+ comma
|
|
doBlocks
|
|
/ macroColon
|
|
))?
|
|
importStmt = 'import' optInd expr
|
|
((comma expr)*
|
|
/ 'except' optInd (expr ^+ comma))
|
|
includeStmt = 'include' optInd expr ^+ comma
|
|
fromStmt = 'from' moduleName '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 = 'break' optInd expr?
|
|
condStmt = expr colcom stmt COMMENT?
|
|
(IND{=} 'elif' expr colcom stmt)*
|
|
(IND{=} 'else' colcom stmt)?
|
|
ifStmt = 'if' condStmt
|
|
whenStmt = 'when' condStmt
|
|
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' exprList colcom stmt)*
|
|
(IND{=}? 'finally' colcom stmt)?
|
|
exceptBlock = 'except' colcom stmt
|
|
forStmt = 'for' (identWithPragma ^+ comma) 'in' expr colcom stmt
|
|
blockStmt = 'block' symbol? colcom stmt
|
|
staticStmt = 'static' colcom stmt
|
|
asmStmt = 'asm' pragma? (STR_LIT | RSTR_LIT | TRIPLE_STR_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(p) = COMMENT? p / (IND{>} (p / COMMENT)^+IND{=} DED)
|
|
constant = identWithPragma (colon typedesc)? '=' optInd expr indAndComment
|
|
enum = 'enum' optInd (symbol optInd ('=' optInd expr COMMENT?)? comma?)+
|
|
objectWhen = 'when' expr colcom objectPart COMMENT?
|
|
('elif' expr colcom objectPart COMMENT?)*
|
|
('else' colcom objectPart COMMENT?)?
|
|
objectBranch = 'of' exprList colcom objectPart
|
|
objectBranches = objectBranch (IND{=} objectBranch)*
|
|
(IND{=} 'elif' expr colcom objectPart)*
|
|
(IND{=} 'else' colcom objectPart)?
|
|
objectCase = 'case' identWithPragma ':' typeDesc ':'? COMMENT?
|
|
(IND{>} objectBranches DED
|
|
| IND{=} objectBranches)
|
|
objectPart = IND{>} objectPart^+IND{=} DED
|
|
/ objectWhen / objectCase / 'nil' / declColonEquals
|
|
object = 'object' pragma? ('of' typeDesc)? COMMENT? objectPart
|
|
typeClassParam = ('var')? symbol
|
|
typeClass = typeClassParam ^* ',' (pragma)? ('of' typeDesc ^* ',')?
|
|
&IND{>} stmt
|
|
distinct = 'distinct' optInd typeDesc
|
|
typeDef = identWithPragma genericParamList? '=' optInd typeDefAux
|
|
indAndComment?
|
|
varTuple = '(' optInd identWithPragma ^+ comma optPar ')' '=' optInd expr
|
|
variable = (varTuple / identColonEquals) 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 | finallyStmt | exceptStmt | forStmt
|
|
| blockStmt | staticStmt | asmStmt
|
|
| 'proc' routine
|
|
| 'method' routine
|
|
| 'iterator' routine
|
|
| 'macro' routine
|
|
| 'template' routine
|
|
| 'converter' routine
|
|
| 'type' section(typeDef)
|
|
| 'const' section(constant)
|
|
| ('let' | 'var') section(variable)
|
|
| bindStmt | mixinStmt)
|
|
/ simpleStmt
|
|
stmt = (IND{>} complexOrSimpleStmt^+(IND{=} / ';') DED)
|
|
/ simpleStmt ^+ ';'
|