Синтаксический анализатор рекурсивного спуска.

(Часть 1 Вступительная).

В данной статье, я хотел бы рассказать о своем опыте написания синтаксического анализатора. Заострим внимание на синтаксических анализаторах, построенных на технологии рекурсивного спуска.

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

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

Анализатор был успешно применен для разрешения создавшихся проблем в моем приложении, которое выполняло расчеты.

В следующей статье я кратко опишу принципы работы анализатора рекурсивного спуска и опишу технологию, которую я применил для эффективного использования функций.

Продолжение следует…

Comments are closed