1234567891011121314151617181920212223242526272829303132333435363738394041 |
- 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
- }
- }
|