const AST = require('./ast') const OsloError = require('./osloError') module.exports = class Env { constructor(parent = null) { this.data = {} if (parent) { Object.keys(parent.data).forEach(key => { this.data[key] = parent.data[key] }) } else { this.data = { '+': (a, b) => new AST.Number({ value: a.value + b.value }), '-': (a, b) => new AST.Number({ value: a.value - b.value }), '*': (a, b) => new AST.Number({ value: a.value * b.value }), '/': (a, b) => new AST.Number({ value: a.value / b.value }), '=': (a, b) => new AST.Boolean({ value: a.value === b.value }), '>': (a, b) => new AST.Boolean({ value: a.value > b.value }), '<': (a, b) => new AST.Boolean({ value: a.value < b.value }), '>=': (a, b) => new AST.Boolean({ value: a.value >= b.value }), '<=': (a, b) => new AST.Boolean({ value: a.value <= b.value }), } } } get(symbol) { if (this.data[symbol.name]) { return this.data[symbol.name] } return new OsloError({ line: symbol.line, message: `Symbol '${symbol.name}' is not bound`, }) } set(symbol, value) { this.data[symbol.name] = value } }