mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
* fix issue #20922 by handling missing expr in `exprList` for `tkOf` * fix line numbers in test case * rewrite exprList requiring expr, add optionalExprList for except As suggested by @metagn. * update test case to reflect new code * update grammar.txt * update line numbers in test case taking into account nimout Given the number of errors that are produced it seems easier to do it this way instead of using `tt.Error`.
217 lines
10 KiB
Plaintext
217 lines
10 KiB
Plaintext
# This file is generated by compiler/parser.nim.
|
|
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' | 'as' | 'from'
|
|
| 'div' | 'mod' | 'shl' | 'shr' | 'not' | 'static' | '..'
|
|
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 | KEYW
|
|
exprColonEqExpr = expr (':'|'=' expr)?
|
|
exprEqExpr = expr ('=' expr)?
|
|
exprList = expr ^+ comma
|
|
optionalExprList = expr ^* comma
|
|
exprColonEqExprList = exprColonEqExpr (comma exprColonEqExpr)* (comma)?
|
|
qualifiedIdent = symbol ('.' optInd symbol)?
|
|
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 ( ('=' 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 symbol ('[:' exprList ']' ( '(' exprColonEqExpr ')' )?)? generalizedLit?
|
|
| DOTLIKEOP optInd symbol generalizedLit?
|
|
| '[' optInd exprColonEqExprList optPar ']'
|
|
| '{' optInd exprColonEqExprList optPar '}'
|
|
pragma = '{.' optInd (exprColonEqExpr comma?)* optPar ('.}' | '}')
|
|
identVis = symbol OPR? # postfix position
|
|
identVisDot = symbol '.' optInd symbol 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 /
|
|
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)
|
|
/ operatorB primary
|
|
/ routineExpr
|
|
/ rawTypeDesc
|
|
/ prefixOperator primary
|
|
rawTypeDesc = (tupleType | routineType | 'enum' | 'object' |
|
|
('var' | 'out' | 'ref' | 'ptr' | 'distinct') typeDesc?)
|
|
('not' expr)?
|
|
typeDescExpr = (routineType / simpleExpr) ('not' expr)?
|
|
typeDesc = rawTypeDesc / typeDescExpr
|
|
typeDefValue = ((tupleDecl | enumDecl | objectDecl | conceptDecl |
|
|
('ref' | 'ptr' | 'distinct') (tupleDecl | objectDecl))
|
|
/ (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 )*
|
|
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)*
|
|
/ '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 expr optInd
|
|
('elif' expr colcom expr optInd)*
|
|
'else' colcom expr
|
|
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?)*
|
|
('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?
|
|
varTuple = '(' optInd identWithPragma ^+ comma optPar ')' '=' 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 ^+ ';'
|