Guest User

Untitled

a guest
Dec 14th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. func genInteger(node *ast.IntegerLiteral, b *bytes.Buffer) string {
  2. tmp := freshTemp()
  3. write(b, "Int %s = Int(%s);\n", tmp, string(node.Token.Lit))
  4. return tmp
  5. }
  6.  
  7. func genString(node *ast.StringLiteral, b *bytes.Buffer) string {
  8. tmp := freshTemp()
  9. str := string(node.Token.Lit)
  10. str = strings.Replace(str, `\`, "\\", -1)
  11.  
  12. write(b, "String %s = String(%s);\n", tmp, str)
  13. return tmp
  14. }
  15.  
  16. func genBoolean(node *ast.Boolean, b *bytes.Buffer) string {
  17. if node.Value {
  18. return "Bool(\"true\")"
  19. } else {
  20. return "Bool(\"false\")"
  21. }
  22. return ""
  23. }
  24.  
  25. func genIdentifier(node *ast.Identifier, b *bytes.Buffer) string {
  26. return node.Value
  27. }
  28.  
  29. func genInfixExpression(node *ast.InfixExpression, b *bytes.Buffer) string {
  30. left := gen(node.Left, b)
  31. right := gen(node.Right, b)
  32. kind := node.Type
  33.  
  34. tmp := freshTemp()
  35. methods := map[string]string{"+": PLUS, "-": MINUS, "==": EQUAL, "<": LT, ">": GT, "*": TIMES, "/": DIVIDE, "or": OR, "and": AND}
  36.  
  37. method, _ := GetMethod(kind, methods[node.Operator])
  38. write(b, "%s %s = %s.%s(%s);\n", method.Return, tmp, left, methods[node.Operator], right)
  39. return tmp
  40. }
  41.  
  42. func genFunctionCall(node *ast.FunctionCall, b *bytes.Buffer) string {
  43. var sig Signature
  44. args := make([]string, len(node.Args))
  45. // store expression tmp vars
  46. for i, arg := range node.Args {
  47. res := gen(arg, b)
  48. args[i] = res
  49. }
  50.  
  51. tmp := freshTemp()
  52. if IsBuiltin(node.Name) {
  53. sig, ok := GetMethod(node.Type, node.Name)
  54. if !ok {
  55. panic("no builtin function")
  56. }
  57.  
  58. write(b, "%s %s = %s.%s(", sig.Return, tmp, args[0], node.Name)
  59. } else {
  60. sig, _ = GetFunctionSignature(node.Name)
  61. write(b, "%s %s = %s(", sig.Return, tmp, node.Name)
  62. for i, arg := range args {
  63. write(b, arg)
  64. if i != len(args)-1 {
  65. write(b, ",")
  66. }
  67. }
  68. }
  69.  
  70. write(b, ");")
  71. return tmp
  72. }
Add Comment
Please, Sign In to add comment