Initial thoughts and groundwork for scoping, activation records, and functions.
This commit is contained in:
parent
9a165a2131
commit
ebbcb87745
14
src/edu/utexas/cs345/jdblisp/SpecialForms.java
Normal file
14
src/edu/utexas/cs345/jdblisp/SpecialForms.java
Normal file
@ -0,0 +1,14 @@
|
||||
package edu.utexas.cs345.jdblisp;
|
||||
|
||||
/**
|
||||
* SpecialForms
|
||||
* @author Jonathan Bernard (jdbernard@gmail.com)
|
||||
*/
|
||||
public class SpecialForms {
|
||||
|
||||
public static SymbolTable createTable() {
|
||||
|
||||
}
|
||||
|
||||
public static TableEntry
|
||||
}
|
52
src/edu/utexas/cs345/jdblisp/SymbolTable.java
Normal file
52
src/edu/utexas/cs345/jdblisp/SymbolTable.java
Normal file
@ -0,0 +1,52 @@
|
||||
package edu.utexas.cs345.jdblisp;
|
||||
|
||||
/**
|
||||
* SymbolTable
|
||||
* @author Jonathan Bernard (jdbernard@gmail.com)
|
||||
*/
|
||||
public class SymbolTable {
|
||||
public final TableEntry top;
|
||||
public final SymbolTable rest;
|
||||
|
||||
public SymbolTable(TableEntry te, SymbolTable st) {
|
||||
this.top = te;
|
||||
this.rest = st;
|
||||
}
|
||||
|
||||
public SymbolTable(TableEntry... te) {
|
||||
int idx = te.length;
|
||||
SymbolTable last = null;
|
||||
while (idx > 1) last = new SymbolTable(te[--idx], last);
|
||||
|
||||
assert (--idx == 0) : "Error in SymbolTable construction. "
|
||||
+ "Invalid ending index";
|
||||
|
||||
this.top = te[0];
|
||||
this.rest = last;
|
||||
}
|
||||
|
||||
public TableEntry findFunction(Symbol symbol) throws LispException {
|
||||
if (top.name.equals(symbol) && top.parameters != null)
|
||||
return top;
|
||||
|
||||
if (rest == null)
|
||||
throw new LispException("Undefined function: "
|
||||
+ symbol.name);
|
||||
|
||||
return rest.findFunction(symbol);
|
||||
}
|
||||
|
||||
public TableEntry findVariable(Symbol symbol) throws LispException {
|
||||
// if this entry is the one we're looking for, return it
|
||||
if (top.name.equals(symbol) && top.parameters == null)
|
||||
return top;
|
||||
|
||||
// if not, and there are no more entries
|
||||
if (rest == null)
|
||||
throw new LispException("Undefined variable: "
|
||||
+ symbol.name);
|
||||
|
||||
// otherwise, search the remainder of the table
|
||||
return rest.findVariable(symbol);
|
||||
}
|
||||
}
|
18
src/edu/utexas/cs345/jdblisp/TableEntry.java
Normal file
18
src/edu/utexas/cs345/jdblisp/TableEntry.java
Normal file
@ -0,0 +1,18 @@
|
||||
package edu.utexas.cs345.jdblisp;
|
||||
|
||||
/**
|
||||
* @author Jonathan Bernard (jdbernard@gmail.com)
|
||||
*/
|
||||
public class TableEntry {
|
||||
|
||||
public final Symbol name;
|
||||
public final Symbol[] parameters;
|
||||
public final SExp body;
|
||||
|
||||
public TableEntry(Symbol name, Symbol[] parameters, SExp body) {
|
||||
this.name = name;
|
||||
this.parameters = parameters;
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user