| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- package evaluator
- import (
- "github/runnignwater/monkey/ast"
- "github/runnignwater/monkey/object"
- )
- var (
- NULL = &object.Null{}
- TRUE = &object.Boolean{Value: true}
- FALSE = &object.Boolean{Value: false}
- )
- func Eval(node ast.Node) object.Object {
- switch node := node.(type) {
- // Statements
- case *ast.Program:
- return evalStatements(node.Statements)
- case *ast.ExpressionStatement:
- return Eval(node.Expression)
- // Expression
- case *ast.IntegerLiteral:
- return &object.Integer{Value: node.Value}
- case *ast.Boolean:
- return nativeBooleanObject(node.Value)
- case *ast.PrefixExpression:
- right := Eval(node.Right)
- return evalPrefixExpression(node.Operator, right)
- }
- return nil
- }
- func evalStatements(stmts []ast.Statement) object.Object {
- var result object.Object
- for _, statement := range stmts {
- result = Eval(statement)
- }
- return result
- }
- func nativeBooleanObject(input bool) *object.Boolean {
- if input {
- return TRUE
- } else {
- return FALSE
- }
- }
- func evalPrefixExpression(operator string, right object.Object) object.Object {
- switch operator {
- case "!":
- return evalBangOperatorExpression(right)
- case "-":
- return evalMinusPreOperatorExpression(right)
- default:
- return NULL
- }
- }
- func evalMinusPreOperatorExpression(right object.Object) object.Object {
- if right.Type() != object.IntegerObj {
- return NULL
- }
- value := right.(*object.Integer).Value
- return &object.Integer{Value: -value}
- }
- func evalBangOperatorExpression(right object.Object) object.Object {
- switch right {
- case TRUE:
- return FALSE
- case FALSE:
- return TRUE
- default:
- return FALSE
- }
- }
|