Guest User

Untitled

a guest
Dec 15th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. func evalProgram(p *ast.Program) (string, error) {
  2. for _, function := range p.Functions {
  3. _, err := checker(function)
  4. if err != nil {
  5. return "", err
  6. }
  7. }
  8.  
  9. for _, statement := range p.Statements {
  10. _, err := checker(statement)
  11. if err != nil {
  12. return "", err
  13. }
  14. }
  15. return "", nil
  16. }
  17.  
  18. // Statements
  19. func evalBlockStatement(node *ast.BlockStatement) (string, error) {
  20. for _, statement := range node.Statements {
  21. result, err := checker(statement)
  22. if err != nil {
  23. return "", err
  24. }
  25. if reflect.TypeOf(statement) == reflect.TypeOf(&ast.ReturnStatement{}) {
  26. return result, nil
  27. }
  28. }
  29. return NOTHING_TYPE, nil
  30. }
  31.  
  32. func evalReturnStatement(node *ast.ReturnStatement) (string, error) {
  33. res, err := checker(node.ReturnValue)
  34. return res, err
  35. }
  36.  
  37. func evalIfStatement(node *ast.IfStatement) (string, error) {
  38. cond, _ := checker(node.Condition)
  39. if cond != BOOL_TYPE {
  40. return "", errors.New("condition not bool type")
  41. }
  42.  
  43. checker(node.Block)
  44. checker(node.Alternative)
  45. return "", nil
  46. }
  47.  
  48. func evalExpressionStatement(node *ast.ExpressionStatement) (string, error) {
  49. _, err := checker(node.Expression)
  50. if err != nil {
  51. return "", err
  52. }
  53.  
  54. return "", nil
  55. }
  56.  
  57. func evalInitStatement(node *ast.InitStatement) (string, error) {
  58. if env.IdentExist(node.Location) {
  59. return "", errors.New("ident already exist")
  60. }
  61.  
  62. right, err := checker(node.Expr)
  63. if err != nil {
  64. return "", err
  65. }
  66.  
  67. env.Set(node.Location, right) // set ident type
  68. return "", nil
  69. }
  70.  
  71. func evalAssignStatement(node *ast.AssignStatement) (string, error) {
  72. right, err := checker(node.Right)
  73. if err != nil {
  74. return "", nil
  75. }
  76.  
  77. if kind, ok := env.Get(node.Left.Value); ok {
  78. if kind != right {
  79. return "", errors.New("invalid type assignment")
  80. }
  81. } else {
  82. return "", errors.New("ident not exist")
  83. }
  84. return "", nil
  85. }
  86.  
  87. func evalFunctionStatement(node *ast.FunctionStatement) (string, error) {
  88. var params []string
  89. for _, param := range node.Parameters {
  90. env.Set(param.Arg, param.Type) // set params into scope
  91. params = append(params, param.Type)
  92. }
  93.  
  94. res, err := checker(node.Body)
  95. if err != nil {
  96. return "", err
  97. }
  98. // check if correct return type
  99. if res != node.Return {
  100. return "", errors.New("incorrect return type")
  101. }
  102.  
  103. SetFunctionSignature(node.Name, Signature{node.Return, params})
  104. return "", nil
  105. }
Add Comment
Please, Sign In to add comment