Опубликован: 27.09.2006 | Уровень: для всех | Доступ: платный | ВУЗ: Московский государственный индустриальный университет
Лекция 12:
Проект "Компилятор формул"
Интерпретатор формул
// Непрерывная реализация стека целых чисел.
class StackInt {
private static final int DEFSIZE = 16;
private int[] array;
private int head;
public StackInt() {
array = new int[DEFSIZE];
head = 0;
}
public final void push(int val) {
array[head++] = val;
}
public final int pop() {
return array[--head];
}
public final int top() {
return array[head-1];
}
}
// Калькулятор арифметических формул.
public class Calc extends Compf {
private StackInt s;
private static int char2int(char c) {
return (int)c - (int)'0';
}
protected int symOther(char c) {
if (c < '0' || c > '9') {
Xterm.println("Недопустимый символ: " + c);
System.exit(0);
}
return SYM_OTHER;
}
protected void nextOper(char c) {
int second = s.pop();
int first = s.pop();
switch (c) {
case '+':
s.push(first + second); break;
case '-':
s.push(first - second); break;
case '*':
s.push(first * second); break;
case '/':
s.push(first / second); break;
}
}
protected void nextOther(char c) {
s.push(char2int(c));
}
public Calc() {
s = new StackInt();
}
public final void compile(char[] str) {
super.compile(str);
Xterm.println("" + s.top());
}
}Тест для интерпретатора формул
// Тест для калькулятора формул.
public class CalcTest {
public static void main(String[] args) throws Exception {
Calc c = new Calc();
while (true)
c.compile(Xterm.inputChars("Введите формулу -> "));
}
}