Guest User

Untitled

a guest
Dec 18th, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. import macros
  2. import tables
  3.  
  4. # Delete later
  5. import streams
  6.  
  7. import ./nimja
  8.  
  9. macro nimjaGo2(head: string, body: untyped) =
  10. result = newStmtList()
  11. var identifiers = newTable[string, NimNode]()
  12.  
  13. for node in body:
  14. if node.kind != nnkIdent:
  15. error("Macro only accepts identifiers!", node)
  16.  
  17. identifiers.add(node.strVal, node)
  18.  
  19. var
  20. parserSym = genSym(nskVar)
  21. tokensSym = genSym(nskVar)
  22. analysisSym = genSym(nskVar)
  23.  
  24. result.add quote do:
  25. var
  26. `parserSym` = new NimjaParser
  27. `tokensSym`: seq[Token]
  28. `analysisSym`: tuple[correct: bool, location: Location, msg: string]
  29. `parserSym`.s = newStringStream(`head`)
  30. `tokensSym` = `parserSym`.tokenize()
  31. `analysisSym` = checkTokens(`tokensSym`)
  32. if `analysisSym`[0] == false:
  33. raise newException(NimjaParseError, `analysisSym`[2])
  34.  
  35.  
  36. var mainBody = nnkStmtList.newTree(nnkCommand.newTree())
  37. for k,v in identifiers:
  38. mainBody[0].add quote do:
  39. if token.val == `k`:
  40. echo `v`
  41.  
  42. var forStmt = newNimNode(nnkForStmt)
  43. forStmt.add(newIdentNode("token"), tokensSym)
  44.  
  45. var ifStmt = nnkIfStmt.newTree(
  46. nnkElifBranch.newTree(
  47. nnkInfix.newTree(
  48. newIdentNode("=="),
  49. nnkDotExpr.newTree(
  50. newIdentNode("token"),
  51. newIdentNode("tokenType")
  52. ),
  53. newIdentNode("tIdent")
  54. ),
  55. mainBody)
  56. )
  57.  
  58. forStmt.add(ifStmt)
  59.  
  60. result.add(forStmt)
  61. echo lispRepr(result, true)
  62.  
  63.  
  64.  
  65.  
  66. var x = 3
  67.  
  68. nimjaGo2 "{{ x }}":
  69. x
Advertisement
Add Comment
Please, Sign In to add comment