Есть ли хороший инструмент для разбора / оценки математических выражений? - PullRequest
1 голос
/ 19 апреля 2011

Argghh:

$ echo 2 4 | bc
(standard_in) 1: parse error
$ echo $?
0

Почему вообще совершенно разумная программа может быть успешной, когда она распознает ошибку разбора?Ясно, что я не могу использовать bc для оценки выражения.Лично мне нравится dc, но мои пользователи не хотят, чтобы его отполировали.Учитывая арифметическое выражение формы, которую распознает bc, существует ли разумная программа для оценки результата?Или есть способ сделать БК разумным?(Здесь «разумный» означает, что он терпит неудачу, когда ввод ложный.)

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

bc попытается восстановиться после ошибок и продолжит обработку последующих операторов.Например:

$ echo "2 + 3; 
    4 4;
    3 + 4" | bc
5
(standard_in) 2: parse error
7

Таким образом, не ясно, должна ли она возвращать ошибку в этом случае.Он успешно проанализировал и обработал ввод, корректно восстановившись после ошибки и продолжив обрабатывать более поздние инструкции.Согласно POSIX поведение bc не определено, когда в неинтерактивном режиме обнаружен неверный ввод, так что это в спецификации того, как bc должен вести себя.

Есливы хотите проверить, не было ли ошибок при обработке вашего ввода, вы можете перенаправить stderr во временный файл, а затем проверить его содержимое на наличие ошибок:

bcerr=$(mktemp -t bcerr)
result=$(echo 2 4 | bc 2>$bcerr)
if test -s $bcerr
then
  # handle errors
else 
  # handle success
fi
rm $bcerr
0 голосов
/ 19 апреля 2011

Вы можете поймать ошибку из bc, посмотрев на вывод stderr, или просто перенаправив stderr в / dev / null и узнав, когда вывод пуст:

answer=$(echo "$expression" | bc 2>/dev/null)
if [ -z "$answer" ]; then
    echo "error in $expression"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...