diff options
author | Adam Strzelecki <ono@java.pl> | 2015-06-02 21:56:44 +0200 |
---|---|---|
committer | Oscar Campbell <oscar@campbell.nu> | 2015-06-07 13:14:52 +0200 |
commit | 83369f4bce15d6d8f4d0bd9a7cb17b2def6daa54 (patch) | |
tree | 527ec28d233e7b81a4dbed306c6fd0ce22392bcd | |
parent | 07c40add8fbc3b4c248c1403f903617a6bdb027e (diff) | |
download | Nim-83369f4bce15d6d8f4d0bd9a7cb17b2def6daa54.tar.gz |
Parser: Inline expr pragmas with parenthesis
Previously pragmas could be attached only to whole statements, this change allows attaching pragmas to inline statements, eg.: template rewriteAdd{a + b}(a: expr, b: expr): expr = ({.noRewrite.}: a + b) + 1 Code above will cause a + b to be rewritten once, because rewriteAdd attaches {.noRewrite.} to resulting a + b expr.
-rw-r--r-- | compiler/parser.nim | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim index 18ef06e64..05b4df13d 100644 --- a/compiler/parser.nim +++ b/compiler/parser.nim @@ -64,6 +64,7 @@ proc setBaseFlags*(n: PNode, base: TNumericalBase) proc parseSymbol*(p: var TParser, allowNil = false): PNode proc parseTry(p: var TParser; isExpr: bool): PNode proc parseCase(p: var TParser): PNode +proc parseStmtPragma(p: var TParser): PNode # implementation proc getTok(p: var TParser) = @@ -502,6 +503,7 @@ proc parsePar(p: var TParser): PNode = #| par = '(' optInd #| ( &parKeyw complexOrSimpleStmt ^+ ';' #| | ';' complexOrSimpleStmt ^+ ';' + #| | pragmaStmt #| | simpleExpr ( ('=' expr (';' complexOrSimpleStmt ^+ ';' )? ) #| | (':' expr (',' exprColonEqExpr ^+ ',' )? ) ) ) #| optPar ')' @@ -523,6 +525,8 @@ proc parsePar(p: var TParser): PNode = getTok(p) optInd(p, result) semiStmtList(p, result) + elif p.tok.tokType == tkCurlyDotLe: + result.add(parseStmtPragma(p)) elif p.tok.tokType != tkParRi: var a = simpleExpr(p) if p.tok.tokType == tkEquals: |