Введение

В информатике, анализатор приоритета операторов — это нисходящий синтаксический анализатор, который интерпретирует грамматику с учетом приоритета операторов. Например, большинство калькуляторов используют анализаторы приоритета операторов для преобразования из инфиксной нотации, привычной для человека и основанной на порядке выполнения операций, в формат, оптимизированный для вычисления, такой как обратная польская нотация (RPN). Алгоритм сортировочной станции Эдсгера Дейкстры обычно используется для реализации анализаторов приоритета операторов.

Связь с другими анализаторами

Анализатор на основе приоритета операторов — это простой анализатор со сдвигом и восстановлением, способный анализировать подмножество грамматик LR(1). Более точно, анализатор приоритета операторов может анализировать все грамматики LR(1), в которых два последовательных нетерминала и эпсилон никогда не встречаются в правой части какого-либо правила. Анализаторы приоритета операторов нечасто используются на практике; однако они обладают некоторыми свойствами, которые делают их полезными в более крупной архитектуре. Во-первых, их достаточно просто написать вручную, что обычно не так для более сложных анализаторов со сдвигом и восстановлением. Во-вторых, их можно реализовать с обращением к таблице операторов во время выполнения, что делает их подходящими для языков, которые могут добавлять или изменять свои операторы в процессе анализа. (Примером является Haskell, который позволяет пользователям определять инфиксные операторы с пользовательской ассоциативностью и приоритетом; следовательно, анализатор приоритета операторов должен быть запущен для программы после анализа всех ссылающихся модулей.) Raku использует анализатор приоритета операторов между двумя рекурсивными спускающимися анализаторами для достижения баланса между скоростью и динамичностью. Анализаторы C и C++ в GCC, реализованные как рекурсивные спускающиеся анализаторы с ручным кодированием, ускоряются благодаря анализатору приоритета операторов, который может быстро проверять арифметические выражения. Анализаторы приоритета операторов также встраиваются в анализаторы, сгенерированные компиляторами, чтобы заметно ускорить рекурсивный спускающийся подход к анализу выражений.

Альтернативные методы

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