evaluator.go 870 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package evaluator
  2. import (
  3. "github/runnignwater/monkey/ast"
  4. "github/runnignwater/monkey/object"
  5. )
  6. var (
  7. NULL = &object.Null{}
  8. TRUE = &object.Boolean{Value: true}
  9. FALSE = &object.Boolean{Value: false}
  10. )
  11. func Eval(node ast.Node) object.Object {
  12. switch node := node.(type) {
  13. // Statements
  14. case *ast.Program:
  15. return evalStatements(node.Statements)
  16. case *ast.ExpressionStatement:
  17. return Eval(node.Expression)
  18. // Expression
  19. case *ast.IntegerLiteral:
  20. return &object.Integer{Value: node.Value}
  21. case *ast.Boolean:
  22. return nativeBooleanObject(node.Value)
  23. }
  24. return nil
  25. }
  26. func evalStatements(stmts []ast.Statement) object.Object {
  27. var result object.Object
  28. for _, statement := range stmts {
  29. result = Eval(statement)
  30. }
  31. return result
  32. }
  33. func nativeBooleanObject(input bool) *object.Boolean {
  34. if input {
  35. return TRUE
  36. } else {
  37. return FALSE
  38. }
  39. }