From f4ad269f8b9f9b0bfcc60bb2584316c3fdd10d10 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Mon, 4 Mar 2024 13:47:27 -0700 Subject: add interpreter --- src/interpreter/SymbolTable.ts | 49 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/interpreter/SymbolTable.ts (limited to 'src/interpreter/SymbolTable.ts') diff --git a/src/interpreter/SymbolTable.ts b/src/interpreter/SymbolTable.ts new file mode 100644 index 0000000..e2ff7e1 --- /dev/null +++ b/src/interpreter/SymbolTable.ts @@ -0,0 +1,49 @@ +export class UndefinedSymbolError extends Error {} + +export class SymbolTable { + private knownSymbols: Set; + private parent: SymbolTable | null; + private depth: number; + + constructor(parent: SymbolTable | null = null) { + this.knownSymbols = new Set(); + this.parent = parent; + this.depth = parent ? parent.getDepth() + 1 : 0; + } + + public getDepth() { + return this.depth; + } + + public add(name: string) { + this.knownSymbols.add(name); + } + + public get(name: string): number { + if (this.knownSymbols.has(name)) { + return 1; + } + + if (this.parent) { + return 1 + this.parent.get(name); + } + + throw new UndefinedSymbolError(`Undefined variable: ${name}`); + } + + public has(name: string): boolean { + if (this.knownSymbols.has(name)) { + return true; + } + + if (this.parent) { + return this.parent.has(name); + } + + return false; + } + + public createChild(): SymbolTable { + return new SymbolTable(this); + } +} -- cgit v1.2.3-70-g09d2