Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №4

.docx
Скачиваний:
18
Добавлен:
29.06.2021
Размер:
44.35 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ КЫРГЫЗСКОЙ РЕСПУБЛИКИ

КЫРГЫЗСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ

УНИВЕРСИТЕТ ИМ. И. РАЗЗАКОВА

Лабораторная работа

Бишкек 2021

Лабораторная работа №4

Цель работы: Изучение и практическое освоение основных принципов разработки компиляторов и интерпретаторов.

Листинг кода:

import java.util.*; public class Main { // УСЛОВИЕ // Написать компилятор для префиксной формы записи (and A,5) логических выражений с построением таблицы четверок и выполнить ее. // Считать, что выражение включает только цифры от 0 до 9, переменные состоят только из одного символа, // количество вложенных скобок и операций неограничено {операции or,and,xor,(,). public static void main(String args[]) { String s = "(4|5)&(6^3)"; System.out.println("Инфиксная форма: " + s); String s1 = infixToPrefix(s); System.out.println("Префиксная форма: " + s1); System.out.println("Результат: "); result(s1); } /*Это функция чтобы проверяет данный символ является оператором или нет*/ static boolean isOperator(char c) { return (!(c >= '0' && c <= '9')); } /*Приоритет*/ static int getPriority(char C) { if (C == '&' || C == '|') return 1; else if (C == '^' || C == '/') return 2; return 0; } /* Это функция переводит с инфиксной формы на префиксный */ static String infixToPrefix(String infix) { /* Создаем 2 стека 1. для операторов 2. для операндов*/ Stack<Character> operators = new Stack<Character>(); Stack<String> operands = new Stack<String>(); for (int i = 0; i < infix.length(); i++) { /*Если символ является открывающей скобкой то ее кидаем в стек*/ if (infix.charAt(i) == '(') { operators.push(infix.charAt(i)); /*Если символ является закрывающей скобкой то цикл будет выполнятся если стек операторов не пусто и самый последний элемент стека оператора не является открывающей скобкой */ } else if (infix.charAt(i) == ')') { while (!operators.empty() && operators.peek() != '(') { String op1 = operands.peek(); operands.pop(); String op2 = operands.peek(); operands.pop(); char op = operators.peek(); operators.pop(); String tmp = op + op2 + op1; operands.push(tmp); } operators.pop(); } /*Если данный символ является операндом то его кидаем в стек операндов*/ else if (!isOperator(infix.charAt(i))) { operands.push(infix.charAt(i) + ""); } else { /* Иначе цикл будет выполняться если стек операторов не пусто и приоритет данного символа меньше или равно оператора самого последнего элмента стека оператора */ while (!operators.empty() && getPriority(infix.charAt(i)) <= getPriority(operators.peek())) { // в переменный op1 складывем верхний элемент стека операнда String op1 = operands.peek(); // И потом удаляем этот операнд operands.pop(); // Здесь также работает как и в первой String op2 = operands.peek(); operands.pop(); // В переменный op заносим оператор и потом удаляем этот оператор и стека char op = operators.peek(); operators.pop(); /*Здесь просто складываем*/ String tmp = op + op2 + op1; operands.push(tmp); } operators.push(infix.charAt(i)); } } /* Если стек не пусто из стеков вытаскиваем элементы складываем друг к другу */ while (!operators.empty()) { String op1 = operands.peek(); operands.pop(); String op2 = operands.peek(); operands.pop(); char op = operators.peek(); operators.pop(); String tmp = op + op2 + op1; operands.push(tmp); } /* Здесь уже лежит готовый префиксная форма нашего выражения */ return operands.peek(); } /*Префиксную форму кидаем на эту функция и это функция начинает выполнять выражению с конца */ static String result(String value) { // Создаем 2 стека и 1 переменный для хранение Stack<Character> operators2 = new Stack<Character>(); Stack<String> operands2 = new Stack<String>(); boolean var = true; System.out.print("Операция " + "Операнд 1 " + "Операнд 3 " + "Результат "); for (int i = value.length() - 1; i >= 0; i--) { /*Если данный символ является операндом то его кидаем в стек операндов*/ if (!isOperator(value.charAt(i))) { operands2.push(value.charAt(i) + ""); } else { // Иначе кидаем данный символ в стек операторов operators2.push(value.charAt(i)); while (!operators2.empty()) { char operator_ = operators2.peek(); System.out.print("\n\t" + operator_ + " "); operators2.pop(); String operand_1 = operands2.peek(); System.out.print("\t\t" + operand_1); operands2.pop(); String operand_2 = operands2.peek(); System.out.print("\t\t " + operand_2); operands2.pop(); /* Логический * операции: or,and,xor,(,)*/ if ((operator_ == '|')) { var = Float.parseFloat(operand_1) < Float.parseFloat(operand_2); } else if (operator_ == '&') { var = Float.parseFloat(String.valueOf(1)) == Float.parseFloat(String.valueOf(2)); }else if (operator_ == '^') { var = Float.parseFloat(operand_1) == Float.parseFloat(operand_2); } System.out.print("\t\t " + var); String temp = String.valueOf(var); operands2.push(temp); } } } return operands2.peek(); } }

Фото результат: