Новые сообщения · Правила  
  • Страница 1 из 1
  • 1
Помогите с проектом
такая проблема, я в программирование дуб дубом можете помочь с компилятором? Язык Ruby
Вот задание: Формулы, содержащие только записанные в шестнадцатеричной системе натуральные числа (обязательно начинающиеся с 0x или 0X), абсолютная величина которых не превосходит 3999, компилируются в программы для стекового калькулятора, содержащие только записанные в десятичной системе счисления числа, и при этом деление трактуется как правоассоциативная операция.
А ниже шаблон в котором надо это сделать
#!/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©}
@data.join(' ')
end

private

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

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

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

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

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

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

# Определение приоритета операции
def priority©
(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
1 | Автор: Хедин | 2013-12-14, 08:57 | Изменено: Хедин - Сб, 2013-12-14, 08:58   |  Репутация: [ + 0 ]
  • Страница 1 из 1
  • 1
Поиск: