Создание калькулятора
Создание
калькулятора
Цель работы:
Создать простейший калькулятор, используя Java.
Краткая теория:
Предметно-ориентированные языки представляют
собой обширную тему для обсуждения, ее невозможно уместить в одном вводном
абзаце. Более подробную информацию о DSL можно найти в еще неопубликованной
книге Мартина Фаулера (Martin Fowler). Обратите особое внимание на различия
между "внутренними" и "внешними" DSL. Благодаря своему
гибкому синтаксису и функциональной природе Scala может с успехом применяться
для создания DSL обоих типов.
Другими словами, в конечном итоге язык должен
позволять клиентам создавать и вычислять выражения аналогично тому, как
показано в листинге 1.
листинг программа калькулятор
// использование интерпретатора DSL в Javas =
"((5 * 10) + 7)";
double result =
com.tedneward.calcdsl.Calculator.evaluate(s);.out.println("We got " +
result); // Should be 57
Те из вас, кто обладает базовым представлением о
теории компиляторов, знают, что работа транслятора (компилятора или интерпретатора)
состоит как минимум из двух основных шагов:
· парсер обрабатывает текст программы
и трансформирует его в абстрактное синтаксическое дерево (AST);
· генератор кода (в случае
компилятора) обрабатывает AST и генерирует машинный код, либо блок вычислений
(в случае интерпретатора) исполняет команды, содержащиеся в AST.
Разделение этих шагов работы транслятора на
отдельные фазы позволяет выполнять оптимизацию промежуточного представления
кода в AST. Например, в случае калькулятора можно проанализировать выражения и
в ряде случаев отбросить целые его части, в частности операнды, умножаемые на
ноль (поскольку результат гарантированно будет равен нулю).
Таким образом, нашей первой задачей будет
определение AST для языка выражений. К счастью, в Scala есть case-классы.
Они не предоставляют мощных средств инкапсуляции, но в них удобно хранить
данные, что в совокупности с другими возможностями делает их подходящим
инструментом для создания AST.
Ход выполнения работы:
Листинг программы:
package javaapplication1;java.awt.*;java.awt.event.*;javax.swing.*;class
Calculator
{static void main(String[] args)
{.invokeLater(new Runnable()
{void run() {frame = new
CalculatorFrame();.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);.setVisible(true);
}
});
}CalculatorFrame extends JFrame
{CalculatorFrame() {("Calculator");panel = new
CalculatorPanel();(panel);();
}
}CalculatorPanel extends JPanel
{CalculatorPanel() {(new BorderLayout());= 0;= "=";=true;= new
JButton("0");.setEnabled(false);(display, BorderLayout.NORTH);insert
= new InsertAction();command = new CommandAction();= new
JPanel();.setLayout(new GridLayout(4, 4));("7",
insert);("8", insert);("9", insert);("/",
command);("4", insert);("5", insert);("6",
insert);("*", command);("1", insert);("2", insert);("3",
insert);("-", command);("0", insert);(".",
insert);("=", command);("+", command);(panel,
BorderLayout.CENTER);
}void addButton(String label,
ActionListener listener) {button = new
JButton(label);.addActionListener(listener);.add(button);
}class InsertAction implements
ActionListener
{void actionPerformed(ActionEvent
event)
{input =
event.getActionCommand();(start) {.setText("");= false;
}.setText(display.getText() +
input);
}
}class CommandAction implements
ActionListener
{void actionPerformed(ActionEvent
event)
{command =
event.getActionCommand();(start)
{(command.equals("-"))
{.setText(command);= false;
}lastCommand = command;
}
{(Double.parseDouble(display.getText()));=
command;=true;
}
}
}void calculate(double x)
}JButton display;JPanel panel;double
result;String lastCommand;boolean start;
}
Результат выполнения
Вывод
Проделав данную лабораторную работу, я научился
создавать простейший калькулятор, используя программную среду Java.