Самый эффективный способ обработки аргументов из командной строки в префиксной записи.
-
22-09-2019 - |
Вопрос
Наша домашняя работа — написать Ruby-скрипт, который вычисляет подмножество списка слов в зависимости от выражения.
обычные бинарные операции
&& And operator
|| Or operator
++ Concatenate operator
! Negation operator
Действительный вызов будет выглядеть так:
./eval.rb wordlist && a c
or
./eval.rb wordlist && || a b c
Первый вызов означает создание нового списка слов, все слова которого имеют хотя бы одну букву «а» и «в».Итак, мой вопрос: как мне эффективно обрабатывать аргументы?Может, рекурсивно?Я застрял...
Заранее спасибо.
Решение
Похоже на грамматик с префиксной записью.Стек действительно ваш друг, и самый простой в использовании стек — это стек вызовов.Например, учитывая эту грамматику:
expression ::= number | operand number number
operand ::= '+' | '-'
Это код для его оценки:
#!/usr/bin/ruby1.8
@tokens = ['*', 2, '+', 3, 4]
def evaluate
token = @tokens.shift # Remove first token from @tokens
case token
when '*'
return evaluate * evaluate
when '+'
return evaluate + evaluate
else
return token
end
end
puts evaluate # => 14
Хотя это Ruby, он достаточно близок к псевдокоду.Я указал явные возвраты, хотя Ruby их не требует, потому что это может быть понятнее для тех, кто не знает Ruby.
Другие советы
Используйте стек.Максимальный размер будет количеством аргументов.