CS143-Lab/assignments/PA1/stack.cl
2023-03-17 15:40:36 +00:00

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