Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Ruby
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2013, 23:10   #1
Dyaside
Новичок
Джуниор
 
Регистрация: 06.12.2013
Сообщений: 2
По умолчанию Стековый компилятор(Ruby)

Изменить что-то в коде, чтобы задача была решина:
Формулы, содержащие только записанные в десятичной системе счисления натуральные числа, абсолютная величина которых не превосходит 3999, компилируются в программы для стекового калькулятора, содержащие римские числа (в записи которых используются цифры I, V, X, L, C, D и M).
Код:
#!/usr/bin/env ruby
require_relative 'stack'
#
# Стековый компилятор формул преобразует правильные
# арифметические формулы (цепочки языка, задаваемого 
# грамматикой G0) в программы для стекового калькулятора
# (цепочки языка, определяемого грамматикой Gs):
#
# G0:
#     F  ->  T  |  F+T  |  F-T
#     T  ->  M  |  T*M  |  T/M
#     M  -> (F) |   V
#     V  ->  a  |   b   |   c   |  ...  |    z
#
# Gs:
#     e  ->  e e + | e e - | e e * | e e / | 
#            | a | b | ... | z 
#
# В качестве операндов в формулах допустимы только 
# однобуквенные имена переменных /^[a-z]$/
# 
class Compf < Stack
  # Константы, задающие тип символа
  SYM_LEFT  = 0 # '('
  SYM_RIGHT = 1 # ')'
  SYM_OPER  = 2 # '+', '-', '*', '/'
  SYM_OTHER = 3 # иные символы

  def initialize
    # Вызов метода initialize класса Stack
    super
    #Создание массива с результатом компиляции
    @data = Array.new
  end

  def compile(str)
    @data.clear
    # Последовательный вызов для всех символов 
    # взятой в скобки формулы метода process_symbol
    "(#{str})".each_char{|c| process_symbol(c)}
    @data.join(' ')
  end

  private

  # Определение типа символа
  def sym_type(c)
    case c
    when '('
      SYM_LEFT
    when ')'
      SYM_RIGHT
    when '+', '-', '*', '/'
      SYM_OPER
    else
      check_symbol(c)
      SYM_OTHER
    end
  end

  # Проверка допустимости символа
  def check_symbol(c)
    raise "Недопустимый символ '#{c}'" if c !~ /[a-z]/
  end

  # Обработка символа
  def process_symbol(c)
    case sym_type(c)
    when SYM_LEFT
      push(c)
    when SYM_RIGHT
      process_suspended_operators(c)
      pop
    when SYM_OPER
      process_suspended_operators(c)
      push(c)
    when SYM_OTHER
      process_value(c)
    end
  end

  # Заключительная обработка имени переменной 
  def process_value(c)
    @data << c 
  end

  # Заключительная обработка символа операции
  def process_oper(c)
    @data <<  c
  end

  # Обработка отложенных операций
  def process_suspended_operators(c)
    while precedes?(top, c) 
      process_oper(pop)
    end
  end

  # Определение приоритета операции
  def priority(c)
    (c == '+' or c == '-') ? 1 : 2
  end

  # Определение отношения предшествования
  def precedes?(a, b)
    return false if sym_type(a) == SYM_LEFT 
    return true  if sym_type(b) == SYM_RIGHT
    priority(a) >= priority(b)
  end
end

if $0 == __FILE__
  c = Compf.new
  loop do
    print "Арифметическая  формула: "
    str = gets.chomp
    print "Результат её компиляции: "
    puts c.compile(str)
    puts 
  end
end
Я нашел небольшой кусочек кода, который поможет в решении задачи, но не знаю как его пристроить
https://groups.google.com/forum/#!ms...A/45EEpZYcp2UJ
Как мне объяснили, то программа на вход должна получать:
Пример: 10+5
На выход: XV+

Последний раз редактировалось Dyaside; 06.12.2013 в 23:14.
Dyaside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стековый калькулятор, чистый Си, реализовать его со связным списком anna27 Помощь студентам 4 09.05.2013 23:31
Компилятор с подмножества языка ruby xz2raza Фриланс 0 08.05.2011 13:54
стековый калькулятор Leva_89 C# (си шарп) 0 25.03.2011 22:23
Постфиксный (стековый) калькулятор (РЕКУРСИЯ) killer007 Фриланс 4 03.06.2010 09:25