Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи на заказ _ Задача...

Автор: 2low4... 12.06.2007 23:19

Доброго времени суток!
Вот такая вот есть задача, надо её решить...

Во входном файле задан текст, за которым следует точка. Проверить, является ли этот текст правильной записью «формулы», где «формулы»:
<формула>:: = <цифра> | <формула> <знак><формула>)
<знак>:: =+| - |*
<цифра>:: = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Решить задачу, используя рекурсию.
Входные данные находятся в файле input.txt. Файл студент формирует самостоятельно. Выходные данные на консоль и в файл output.txt.

Если там надо за как тут написано "денюжку" - не вопрос, просто хочется посмотреть как она решается, не 1 час над ней просидел...
Если что my ICQ := 262363792

Автор: klem4 12.06.2007 23:38

Цитата
Если там надо за как тут написано "денюжку"


В конкретно этом разделе да. А вообще задача и похожие решались, поиск в помощь ...

Автор: Гость 13.06.2007 16:44

Попробую навскидку объяснить, как это делается. Если ошибки будут, не пинайте, давно ничего подобного не писал, уж забыл много чего.

<формула>:: = <цифра> | <формула> <знак><формула>)
<знак>:: =+| - |*
<цифра>:: = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Это приводится к грамматике:

F = D
F = F S F
S = +
S = -
S = *
D = 0
...
D = 9

Теперь программируем грамматику, используя функции (по одной на один нетерминальный символ):
(юзаем заранее определённые процедуры "взять токен" и "определить принадлежность нетерминальному символу", т.е. T(oken) = D, S, F и т.д.).
T - текущий токен. Конструкция T = ... означает совпадение первого токена с первым токеном соответствующего нетерминального символа.
"Ошибка" подразумевает выход из алгоритма с возвращение отрицательного результата ("не соответствует грамматике").

вот псевдокод.

F():
{
взять токен, если T=D, то D(),
иначе
если T=F, то F(),
иначе Ошибка;

взять токен, если T=S, то S(),
иначе Ошибка;
взять токен, если T=F, то F(),
иначе Ошибка;
взять токен, если T не является пустой строкой, то Ошибка, иначе - корректно.
}

D():
{
взять токен, если T<> '1' и T<>'2' ... и T<>'9', то Ошибка;
}
S():
{
взять токен, если T<>'-' и T<>'+' и T<>'*', то Ошибка.
}

Теперь просто где-нибудь в коде вызываем F() - и синтаксический анализ пошёл. Если вызов F() самого верхнего уровня вернёт true, то формула удовлетворяет грамматике.