119 lines
2.8 KiB
Common Lisp
119 lines
2.8 KiB
Common Lisp
(*
|
|
* CS164 Fall 94
|
|
*
|
|
* Programming Assignment 1
|
|
* Implementation of a simple stack machine.
|
|
*
|
|
* Skeleton file
|
|
*)
|
|
|
|
class List {
|
|
isNil() : Bool { true };
|
|
head() : String { { abort(); ""; } };
|
|
tail() : List { { abort(); self; } };
|
|
cons(i : String) : List {
|
|
(new Cons).init(i, self)
|
|
};
|
|
};
|
|
|
|
class Cons inherits List {
|
|
car : String; -- The element in this list cell
|
|
cdr : List; -- The rest of the list
|
|
isNil() : Bool { false };
|
|
head() : String { car };
|
|
tail() : List { cdr };
|
|
init(i : String, rest : List) : List {
|
|
{
|
|
car <- i;
|
|
cdr <- rest;
|
|
self;
|
|
}
|
|
};
|
|
};
|
|
|
|
class Main inherits IO {
|
|
stack : List;
|
|
converter: A2I <- new A2I;
|
|
print_list(l: List) : Object {
|
|
if l.isNil() then {
|
|
dummy();
|
|
}
|
|
else {
|
|
out_string(l.head());
|
|
out_string("\n");
|
|
print_list(l.tail());
|
|
}
|
|
fi
|
|
};
|
|
|
|
pop_stack() : Object {
|
|
stack <- stack.tail()
|
|
};
|
|
|
|
push_stack(s: String) : Object {
|
|
stack <- stack.cons(s)
|
|
};
|
|
|
|
read_input() : String {
|
|
{
|
|
out_string(">");
|
|
in_string();
|
|
}
|
|
};
|
|
|
|
dummy() : Object {
|
|
0
|
|
};
|
|
|
|
main() : Object {
|
|
{
|
|
stack <- new List;
|
|
let input: String <- read_input() in {
|
|
while (not(input = "x")) loop {
|
|
if (input = "e") then {
|
|
if (not stack.isNil()) then
|
|
if (stack.head() = "+") then {
|
|
pop_stack();
|
|
let val1 : Int <- converter.a2i(stack.head()) in {
|
|
pop_stack();
|
|
let val2 : Int <- converter.a2i(stack.head()) in {
|
|
pop_stack();
|
|
push_stack(converter.i2a(val1 + val2));
|
|
};
|
|
};
|
|
}
|
|
else if (stack.head() = "s") then {
|
|
pop_stack();
|
|
let val1 : String <- stack.head() in {
|
|
pop_stack();
|
|
let val2 : String <- stack.head() in {
|
|
pop_stack();
|
|
push_stack(val1);
|
|
push_stack(val2);
|
|
};
|
|
};
|
|
}
|
|
else {
|
|
dummy();
|
|
}
|
|
fi fi
|
|
else {
|
|
dummy();
|
|
}
|
|
fi;
|
|
}
|
|
else if (input = "d") then {
|
|
print_list(stack);
|
|
}
|
|
else {
|
|
push_stack(input);
|
|
}
|
|
fi fi;
|
|
input <- read_input();
|
|
}
|
|
pool;
|
|
};
|
|
}
|
|
};
|
|
};
|