(Часть 1
Вступительная).
В данной статье, я хотел бы рассказать
о своем опыте написания синтаксического анализатора. Заострим внимание на
синтаксических анализаторах, построенных на технологии рекурсивного спуска.
В программировании гибко
настраиваемых программ мне пришлось столкнуться с проблемой, когда требования к
последовательности расчетов и к самим расчетам очень динамично изменяются.
Вначале мне приходилось мучиться с переписыванием того или иного куска кода,
затем заново отлаживать и перекомпилировать программу, что естественно отнимало
много времени, да и нервов. Вот поэтому я стал искать более гибкий путь, который бы исключал все те трудности, с
которыми я столкнулся. О создании
полнофункционального внутреннего языка приложения и речи не могло быть, потому
что это просто было бы не осуществимо для одного человека. Поэтому я решил
изучить методы работы и технологию написания анализаторов.
В интернете я тщетно
пытался найти подходящий open source проект, но так и не смог ничего найти
путного. Я был в отчаянии. Но когда приобрел книгу Г. Шилдта «Полный справочник
по C#», то в ней
отыскал то, что так долго искал. А именно открытый код анализатора рекурсивного
спуска, который считается самым простеньким среди богатой разновидности
анализаторов. Анализатор, описанный в
книге, умел складывать, вычитать, умножать, делить и возводить в степень любые
отрицательные и положительные числа, как целые, так и с плавающей точкой, но
при этом все это со строгим соблюдением приоритетов операций и скобок любой
вложенности. Наряду с этим он мог
работать с переменными, в которые можно было сохранять промежуточные результаты
вычислений, а также производить все арифметические операции с участие
переменных и чисел. Также анализатор
может корректно возводить в степень, как одиночное число, так и числа в скобках
любой вложенности. Очень резвый анализатор. Единственное чего он не мог, так это
оперировать со строками и функциями. Эти вопросы автор книги предоставил на
разрешение программисту. Что я с удовольствием и сделал, написав дополнительные
блоки кода. Немного изменив код
анализатора, добился нужных результатов.
Анализатор был успешно применен
для разрешения создавшихся проблем в моем приложении, которое выполняло расчеты.
В следующей статье я кратко опишу
принципы работы анализатора рекурсивного спуска и опишу технологию, которую я
применил для эффективного использования функций.
Продолжение следует…