Guest User

Untitled

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