Initial implementation of the parseExpr, parseStmt, getAst macro routines:
proc parseExpr*(s: string) : expr {.magic: "ParseExprToAst".}
## Compiles the passed string to its AST representation
## Expects a single expression
proc parseStmt*(s: string) : stmt {.magic: "ParseStmtToAst".}
## Compiles the passed string to its AST representation
## Expects one or more statements
proc getAst*(macroOrTemplate: expr): expr {.magic: "ExpandMacroToAst".}
## Obtains the AST nodes returned from a macro or template invocation
## example:
## macro FooMacro() =
## var ast = getAst(BarTemplate())
Handling of the node.toYaml magic moved to the evaluation engine.
This commit is contained in:
parent
d541815e4b
commit
91351e5996
6 changed files with 144 additions and 37 deletions
|
|
@ -30,6 +30,11 @@ proc closeParser*(p: var TParser)
|
|||
proc parseTopLevelStmt*(p: var TParser): PNode
|
||||
# implements an iterator. Returns the next top-level statement or
|
||||
# emtyNode if end of stream.
|
||||
|
||||
proc parseString*(s: string, filename: string = "", line: int = 0): PNode
|
||||
# filename and line could be set optionally, when the string originates
|
||||
# from a certain source file. This way, the compiler could generate
|
||||
# correct error messages referring to the original source.
|
||||
|
||||
# helpers for the other parsers
|
||||
proc getPrecedence*(tok: TToken): int
|
||||
|
|
@ -1369,3 +1374,13 @@ proc parseTopLevelStmt(p: var TParser): PNode =
|
|||
result = complexOrSimpleStmt(p)
|
||||
if result.kind == nkEmpty: parMessage(p, errExprExpected, p.tok)
|
||||
break
|
||||
|
||||
proc parseString(s: string, filename: string = "", line: int = 0): PNode =
|
||||
var stream = LLStreamOpen(s)
|
||||
stream.lineOffset = line
|
||||
|
||||
var parser : TParser
|
||||
OpenParser(parser, filename, stream)
|
||||
|
||||
result = parser.parseAll
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue