grammar changes for table constructor: first part
This commit is contained in:
parent
36c67455d4
commit
f00072fd55
2 changed files with 34 additions and 26 deletions
|
|
@ -7,7 +7,7 @@
|
||||||
# distribution, for details about the copyright.
|
# distribution, for details about the copyright.
|
||||||
#
|
#
|
||||||
|
|
||||||
# This module implements the parser of the standard Nimrod representation.
|
# This module implements the parser of the standard Nimrod syntax.
|
||||||
# The parser strictly reflects the grammar ("doc/grammar.txt"); however
|
# The parser strictly reflects the grammar ("doc/grammar.txt"); however
|
||||||
# it uses several helper routines to keep the parser small. A special
|
# it uses several helper routines to keep the parser small. A special
|
||||||
# efficient algorithm is used for the precedence levels. The parser here can
|
# efficient algorithm is used for the precedence levels. The parser here can
|
||||||
|
|
@ -259,13 +259,13 @@ proc dotdotExpr(p: var TParser, first: PNode): PNode =
|
||||||
addSon(result, optExpr(p))
|
addSon(result, optExpr(p))
|
||||||
|
|
||||||
proc indexExpr(p: var TParser): PNode =
|
proc indexExpr(p: var TParser): PNode =
|
||||||
# indexExpr ::= '..' [expr] | expr ['=' expr | '..' expr]
|
# indexExpr ::= '..' [expr] | expr ['=' expr]
|
||||||
if p.tok.tokType == tkDotDot:
|
if p.tok.tokType == tkDotDot:
|
||||||
result = dotdotExpr(p, ast.emptyNode)
|
result = dotdotExpr(p, ast.emptyNode)
|
||||||
else:
|
else:
|
||||||
var a = parseExpr(p)
|
result = parseExpr(p)
|
||||||
case p.tok.tokType
|
if p.tok.tokType == tkEquals:
|
||||||
of tkEquals:
|
var a = result
|
||||||
result = newNodeP(nkExprEqExpr, p)
|
result = newNodeP(nkExprEqExpr, p)
|
||||||
addSon(result, a)
|
addSon(result, a)
|
||||||
getTok(p)
|
getTok(p)
|
||||||
|
|
@ -275,9 +275,6 @@ proc indexExpr(p: var TParser): PNode =
|
||||||
var b = parseExpr(p)
|
var b = parseExpr(p)
|
||||||
if p.tok.tokType == tkDotDot: b = dotdotExpr(p, b)
|
if p.tok.tokType == tkDotDot: b = dotdotExpr(p, b)
|
||||||
addSon(result, b)
|
addSon(result, b)
|
||||||
of tkDotDot:
|
|
||||||
result = dotdotExpr(p, a)
|
|
||||||
else: result = a
|
|
||||||
|
|
||||||
proc indexExprList(p: var TParser, first: PNode): PNode =
|
proc indexExprList(p: var TParser, first: PNode): PNode =
|
||||||
result = newNodeP(nkBracketExpr, p)
|
result = newNodeP(nkBracketExpr, p)
|
||||||
|
|
@ -304,13 +301,13 @@ proc exprColonEqExpr(p: var TParser, kind: TNodeKind, tok: TTokType): PNode =
|
||||||
addSon(result, parseExpr(p))
|
addSon(result, parseExpr(p))
|
||||||
else:
|
else:
|
||||||
result = a
|
result = a
|
||||||
|
|
||||||
proc exprListAux(p: var TParser, elemKind: TNodeKind, endTok, sepTok: TTokType,
|
proc exprList(p: var TParser, endTok: TTokType,
|
||||||
result: PNode) =
|
result: PNode) =
|
||||||
getTok(p)
|
getTok(p)
|
||||||
optInd(p, result)
|
optInd(p, result)
|
||||||
while (p.tok.tokType != endTok) and (p.tok.tokType != tkEof):
|
while (p.tok.tokType != endTok) and (p.tok.tokType != tkEof):
|
||||||
var a = exprColonEqExpr(p, elemKind, sepTok)
|
var a = parseExpr(p)
|
||||||
addSon(result, a)
|
addSon(result, a)
|
||||||
if p.tok.tokType != tkComma: break
|
if p.tok.tokType != tkComma: break
|
||||||
getTok(p)
|
getTok(p)
|
||||||
|
|
@ -538,9 +535,19 @@ proc lowestExprAux(p: var TParser, v: var PNode, limit: int): PToken =
|
||||||
opPrec = getPrecedence(nextop)
|
opPrec = getPrecedence(nextop)
|
||||||
result = op # return first untreated operator
|
result = op # return first untreated operator
|
||||||
|
|
||||||
proc lowestExpr(p: var TParser): PNode =
|
proc otherExpr(p: var TParser): PNode =
|
||||||
discard lowestExprAux(p, result, - 1)
|
discard lowestExprAux(p, result, - 1)
|
||||||
|
|
||||||
|
proc lowestExpr(p: var TParser): PNode =
|
||||||
|
result = otherExpr(p)
|
||||||
|
while p.tok.tokType == tkDotDot:
|
||||||
|
getTok(p)
|
||||||
|
optInd(p, result)
|
||||||
|
var a = result
|
||||||
|
result = newNodeP(nkRange, p)
|
||||||
|
addSon(result, a)
|
||||||
|
addSon(result, otherExpr(p))
|
||||||
|
|
||||||
proc parseIfExpr(p: var TParser): PNode =
|
proc parseIfExpr(p: var TParser): PNode =
|
||||||
result = newNodeP(nkIfExpr, p)
|
result = newNodeP(nkIfExpr, p)
|
||||||
while true:
|
while true:
|
||||||
|
|
@ -769,7 +776,7 @@ proc parseExprStmt(p: var TParser): PNode =
|
||||||
case p.tok.tokType
|
case p.tok.tokType
|
||||||
of tkOf:
|
of tkOf:
|
||||||
b = newNodeP(nkOfBranch, p)
|
b = newNodeP(nkOfBranch, p)
|
||||||
exprListAux(p, nkRange, tkColon, tkDotDot, b)
|
exprList(p, tkColon, b)
|
||||||
of tkElif:
|
of tkElif:
|
||||||
b = newNodeP(nkElifBranch, p)
|
b = newNodeP(nkElifBranch, p)
|
||||||
getTok(p)
|
getTok(p)
|
||||||
|
|
@ -922,7 +929,7 @@ proc parseCase(p: var TParser): PNode =
|
||||||
of tkOf:
|
of tkOf:
|
||||||
if inElif: break
|
if inElif: break
|
||||||
b = newNodeP(nkOfBranch, p)
|
b = newNodeP(nkOfBranch, p)
|
||||||
exprListAux(p, nkRange, tkColon, tkDotDot, b)
|
exprList(p, tkColon, b)
|
||||||
of tkElif:
|
of tkElif:
|
||||||
inElif = true
|
inElif = true
|
||||||
b = newNodeP(nkElifBranch, p)
|
b = newNodeP(nkElifBranch, p)
|
||||||
|
|
@ -1232,7 +1239,7 @@ proc parseObjectCase(p: var TParser): PNode =
|
||||||
case p.tok.tokType
|
case p.tok.tokType
|
||||||
of tkOf:
|
of tkOf:
|
||||||
b = newNodeP(nkOfBranch, p)
|
b = newNodeP(nkOfBranch, p)
|
||||||
exprListAux(p, nkRange, tkColon, tkDotDot, b)
|
exprList(p, tkColon, b)
|
||||||
of tkElse:
|
of tkElse:
|
||||||
b = newNodeP(nkElse, p)
|
b = newNodeP(nkElse, p)
|
||||||
getTok(p)
|
getTok(p)
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,8 @@ prefixOperator ::= OP0 | OP3 | OP4 | OP5 | OP6 | OP7 | 'not'
|
||||||
optInd ::= [COMMENT] [IND]
|
optInd ::= [COMMENT] [IND]
|
||||||
optPar ::= [IND] | [SAD]
|
optPar ::= [IND] | [SAD]
|
||||||
|
|
||||||
lowestExpr ::= orExpr (OP0 optInd orExpr)*
|
lowestExpr ::= otherExpr ('..' optInd otherExpr)*
|
||||||
|
otherExpr ::= orExpr (OP0 optInd orExpr)*
|
||||||
orExpr ::= andExpr (OR | 'xor' optInd andExpr)*
|
orExpr ::= andExpr (OR | 'xor' optInd andExpr)*
|
||||||
andExpr ::= cmpExpr ('and' optInd cmpExpr)*
|
andExpr ::= cmpExpr ('and' optInd cmpExpr)*
|
||||||
cmpExpr ::= ampExpr (OP3 | 'is' | 'isnot' | 'in' | 'notin' optInd ampExpr)*
|
cmpExpr ::= ampExpr (OP3 | 'is' | 'isnot' | 'in' | 'notin' optInd ampExpr)*
|
||||||
|
|
@ -19,7 +20,7 @@ plusExpr ::= mulExpr (OP5 optInd mulExpr)*
|
||||||
mulExpr ::= dollarExpr (OP6 | 'div' | 'mod' | 'shl' | 'shr' optInd dollarExpr)*
|
mulExpr ::= dollarExpr (OP6 | 'div' | 'mod' | 'shl' | 'shr' optInd dollarExpr)*
|
||||||
dollarExpr ::= primary (OP7 optInd primary)*
|
dollarExpr ::= primary (OP7 optInd primary)*
|
||||||
|
|
||||||
indexExpr ::= '..' [expr] | expr ['=' expr | '..' expr]
|
indexExpr ::= '..' [expr] | expr ['=' expr]
|
||||||
|
|
||||||
castExpr ::= 'cast' '[' optInd typeDesc optPar ']' '(' optInd expr optPar ')'
|
castExpr ::= 'cast' '[' optInd typeDesc optPar ']' '(' optInd expr optPar ')'
|
||||||
addrExpr ::= 'addr' '(' optInd expr optPar ')'
|
addrExpr ::= 'addr' '(' optInd expr optPar ')'
|
||||||
|
|
@ -49,7 +50,7 @@ literal ::= INT_LIT | INT8_LIT | INT16_LIT | INT32_LIT | INT64_LIT
|
||||||
|
|
||||||
constructor ::= literal
|
constructor ::= literal
|
||||||
| '[' optInd colonExprList optPar ']'
|
| '[' optInd colonExprList optPar ']'
|
||||||
| '{' optInd sliceExprList optPar '}'
|
| '{' optInd ':' | colonExprList optPar '}'
|
||||||
| '(' optInd colonExprList optPar ')'
|
| '(' optInd colonExprList optPar ')'
|
||||||
|
|
||||||
colonExpr ::= expr [':' expr]
|
colonExpr ::= expr [':' expr]
|
||||||
|
|
@ -58,9 +59,6 @@ colonExprList ::= [colonExpr (comma colonExpr)* [comma]]
|
||||||
namedExpr ::= expr ['=' expr]
|
namedExpr ::= expr ['=' expr]
|
||||||
namedExprList ::= [namedExpr (comma namedExpr)* [comma]]
|
namedExprList ::= [namedExpr (comma namedExpr)* [comma]]
|
||||||
|
|
||||||
sliceExpr ::= expr ['..' expr]
|
|
||||||
sliceExprList ::= [sliceExpr (comma sliceExpr)* [comma]]
|
|
||||||
|
|
||||||
exprOrType ::= lowestExpr
|
exprOrType ::= lowestExpr
|
||||||
| 'if' expr ':' expr ('elif' expr ':' expr)* 'else' ':' expr
|
| 'if' expr ':' expr ('elif' expr ':' expr)* 'else' ':' expr
|
||||||
| 'var' exprOrType
|
| 'var' exprOrType
|
||||||
|
|
@ -72,12 +70,15 @@ exprOrType ::= lowestExpr
|
||||||
expr ::= exprOrType
|
expr ::= exprOrType
|
||||||
| 'proc' paramList [pragma] ['=' stmt]
|
| 'proc' paramList [pragma] ['=' stmt]
|
||||||
|
|
||||||
|
exprList ::= [expr (comma expr)* [comma]]
|
||||||
|
|
||||||
|
|
||||||
qualifiedIdent ::= symbol ['.' symbol]
|
qualifiedIdent ::= symbol ['.' symbol]
|
||||||
|
|
||||||
typeDesc ::= exprOrType
|
typeDesc ::= exprOrType
|
||||||
| 'proc' paramList [pragma]
|
| 'proc' paramList [pragma]
|
||||||
|
|
||||||
macroStmt ::= ':' [stmt] ('of' [sliceExprList] ':' stmt
|
macroStmt ::= ':' [stmt] ('of' [exprList] ':' stmt
|
||||||
|'elif' expr ':' stmt
|
|'elif' expr ':' stmt
|
||||||
|'except' exceptList ':' stmt )*
|
|'except' exceptList ':' stmt )*
|
||||||
['else' ':' stmt]
|
['else' ':' stmt]
|
||||||
|
|
@ -115,7 +116,7 @@ breakStmt ::= 'break' [symbol]
|
||||||
continueStmt ::= 'continue'
|
continueStmt ::= 'continue'
|
||||||
ifStmt ::= 'if' expr ':' stmt ('elif' expr ':' stmt)* ['else' ':' stmt]
|
ifStmt ::= 'if' expr ':' stmt ('elif' expr ':' stmt)* ['else' ':' stmt]
|
||||||
whenStmt ::= 'when' expr ':' stmt ('elif' expr ':' stmt)* ['else' ':' stmt]
|
whenStmt ::= 'when' expr ':' stmt ('elif' expr ':' stmt)* ['else' ':' stmt]
|
||||||
caseStmt ::= 'case' expr [':'] ('of' sliceExprList ':' stmt)*
|
caseStmt ::= 'case' expr [':'] ('of' exprList ':' stmt)*
|
||||||
('elif' expr ':' stmt)*
|
('elif' expr ':' stmt)*
|
||||||
['else' ':' stmt]
|
['else' ':' stmt]
|
||||||
whileStmt ::= 'while' expr ':' stmt
|
whileStmt ::= 'while' expr ':' stmt
|
||||||
|
|
@ -167,7 +168,7 @@ objectWhen ::= 'when' expr ':' [COMMENT] objectPart
|
||||||
('elif' expr ':' [COMMENT] objectPart)*
|
('elif' expr ':' [COMMENT] objectPart)*
|
||||||
['else' ':' [COMMENT] objectPart]
|
['else' ':' [COMMENT] objectPart]
|
||||||
objectCase ::= 'case' expr ':' typeDesc [COMMENT]
|
objectCase ::= 'case' expr ':' typeDesc [COMMENT]
|
||||||
('of' sliceExprList ':' [COMMENT] objectPart)*
|
('of' exprList ':' [COMMENT] objectPart)*
|
||||||
['else' ':' [COMMENT] objectPart]
|
['else' ':' [COMMENT] objectPart]
|
||||||
|
|
||||||
objectPart ::= objectWhen | objectCase | objectIdentPart | 'nil'
|
objectPart ::= objectWhen | objectCase | objectIdentPart | 'nil'
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue