|
Попробую навскидку объяснить, как это делается. Если ошибки будут, не пинайте, давно ничего подобного не писал, уж забыл много чего.
<формула>:: = <цифра> | <формула> <знак><формула>) <знак>:: =+| - |* <цифра>:: = 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, то формула удовлетворяет грамматике.
|