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