Guest User

Untitled

a guest
Dec 14th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. func genProgram(node *ast.Program, b *bytes.Buffer) string {
  2. write(b, "#include <string>\n#include <iostream>\n#include \"Builtins.cpp\"\n\n")
  3.  
  4. for _, funcs := range node.Functions {
  5. gen(funcs, b)
  6. }
  7.  
  8. write(b, "int main() {\n")
  9. for _, stmt := range node.Statements {
  10. gen(stmt, b)
  11. }
  12. write(b, "return 0;\n}")
  13. return ""
  14. }
  15.  
  16. func genBlockStatement(node *ast.BlockStatement, b *bytes.Buffer) string {
  17. for _, stmt := range node.Statements {
  18. gen(stmt, b)
  19. }
  20. return ""
  21. }
  22.  
  23. func genExpressionStatement(node *ast.ExpressionStatement, b *bytes.Buffer) string {
  24. value := gen(node.Expression, b)
  25. write(b, "%s;\n", value)
  26. return ""
  27. }
  28.  
  29. func genAssignStatement(node *ast.AssignStatement, b *bytes.Buffer) string {
  30. right := gen(node.Right, b)
  31. // get left type
  32. write(b, "%s = %s;\n", node.Left.Value, right)
  33. return ""
  34. }
  35.  
  36. func genInitStatement(node *ast.InitStatement, b *bytes.Buffer) string {
  37. right := gen(node.Expr, b)
  38. kind, _ := GetIdentType(node.Location)
  39. write(b, "%s %s = %s;\n", kind, node.Location, right)
  40. return ""
  41. }
  42.  
  43. func genReturnStatement(node *ast.ReturnStatement, b *bytes.Buffer) string {
  44. value := gen(node.ReturnValue, b)
  45. write(b, "return %s;\n", value)
  46. return ""
  47. }
  48.  
  49. func genFunctionStatement(node *ast.FunctionStatement, b *bytes.Buffer) string {
  50. if IsBuiltin(node.Name) {
  51. panic("built in function")
  52. }
  53.  
  54. write(b, "%s %s(", node.Return, node.Name)
  55.  
  56. for i, arg := range node.Parameters {
  57. write(b, "%s %s", arg.Type, arg.Arg)
  58. if i != len(node.Parameters)-1 {
  59. write(b, ",")
  60. }
  61. }
  62. write(b, ") {\n")
  63. gen(node.Body, b)
  64. write(b, "}\n\n")
  65. return ""
  66. }
  67.  
  68. func genIfStatement(node *ast.IfStatement, b *bytes.Buffer) string {
  69. cond := gen(node.Condition, b)
  70. write(b, "if (\"true\" == %s.val) {\n", cond)
  71. gen(node.Block, b)
  72. write(b, "} else {\n")
  73. gen(node.Alternative, b)
  74. write(b, "}\n\n")
  75. return ""
  76. }
Add Comment
Please, Sign In to add comment