Читать «Полный справочник по С++» онлайн - страница 437
Герберт Шилдт
На самом деле синтаксический анализ выражений — весьма простая процедура. Во многих отношениях она гораздо проще других задач, возникающих перед программистами. Ее простота является следствием строгих правил алгебры. В этой главе мы рассмотрим программу рекурсивного нисходящего анализа (recursive-descent parser) и все вспомогательные процедуры, позволяющие вычислять арифметические выражения. Мы разработаем три версии программы синтаксического анализа выражений. Первые две версии являются обычными, а третья — обобщенной. Ее можно применять к любым числовым типам. Однако перед тем как приступить к разработке синтаксического анализатора, необходимо сделать краткий обзор выражений и правил их грамматического разбора.
□
Выражения
Поскольку программа синтаксического разбора вычисляет алгебраические выражения, необходимо ясно представлять себе, из каких частей состоят выражения. Хотя в принципе выражения могут содержать самую разнообразную информацию, в рамках этой главы нас будут интересовать исключительно арифметические выражения. Для наших целей мы рассмотрим выражения, состоящие из следующих компонентов.
• Числа
• Операции +, -, /, *, А, % и =
• Скобки
• Переменные
В нашем синтаксическом анализаторе символ А будет означать возведение в степень (а не логическую операцию исключающего “ИЛИ”, как обычно). Символ = обозначает оператор присваивания. Перечисленные выше компоненты объединяются в выражения в соответствии с правилами алгебры. Приведем некоторые примеры.
10-8
(100—5)*14/6
а+Ь-с
10*5
а=10-Ь
Установим следующие приоритеты операторов.
+ - (унврные)
высший
* / %
+ -
НИЗШИЙ
Операторы, имеющие одинаковый приоритет, вычисляются слева направо.
В примерах, рассмотренных по ходу изложения, все переменные обозначаются одной буквой (иначе говоря, допускается использование лишь 26 переменных* соответствующих буквам от а до z). Строчные и прописные буквы не различаются (буквы а и а считаются одинаковыми). В первой версии анализатора все числовые переменные приводятся к типу double, хотя читатели легко смогут модифицировать эту программу, настроив ее на обработку любого другого числового типа. Кроме того, для упрощения логики программы в нес включены минимальиые средства проверки ошибок.
Ш Синтаксический анализ выражений: постановка задачи
На первый взгляд, синтаксический анализ выражений кажется довольно простой задачей. Однако, чтобы лучше понять ее, попробуйте-ка вычислить выражение
| 10-2*3
Как известно, результат этого выражения равен 4. Несмотря на то что создать программу, вычисляющую это арифметическое выражение, довольно легко, возникает вопрос, как создать программу, вычисляющую правильный результат произвольного выражения. В качестве первого варианта можно написать следующую программу.
а = первый операнд whi!e(ecTb операнды) ор = оператор b = второй операнд а = a op b