Введение
В информатике, анализатор приоритета операторов — это нисходящий синтаксический анализатор, который интерпретирует грамматику с учетом приоритета операторов. Например, большинство калькуляторов используют анализаторы приоритета операторов для преобразования из инфиксной нотации, привычной для человека и основанной на порядке выполнения операций, в формат, оптимизированный для вычисления, такой как обратная польская нотация (RPN). Алгоритм сортировочной станции Эдсгера Дейкстры обычно используется для реализации анализаторов приоритета операторов.
In computer science, an operator precedence parser is a bottom up parser that interprets an operator precedence grammar. For example, most calculators use operator precedence parsers to convert from the human readable infix notation relying on order of operations to a format that is optimized for evaluation such as Reverse Polish notation (RPN). Edsger Dijkstra's shunting yard algorithm is commonly used to implement operator precedence parsers.
Связь с другими анализаторами
Анализатор на основе приоритета операторов — это простой анализатор со сдвигом и восстановлением, способный анализировать подмножество грамматик LR(1). Более точно, анализатор приоритета операторов может анализировать все грамматики LR(1), в которых два последовательных нетерминала и эпсилон никогда не встречаются в правой части какого-либо правила. Анализаторы приоритета операторов нечасто используются на практике; однако они обладают некоторыми свойствами, которые делают их полезными в более крупной архитектуре. Во-первых, их достаточно просто написать вручную, что обычно не так для более сложных анализаторов со сдвигом и восстановлением. Во-вторых, их можно реализовать с обращением к таблице операторов во время выполнения, что делает их подходящими для языков, которые могут добавлять или изменять свои операторы в процессе анализа. (Примером является Haskell, который позволяет пользователям определять инфиксные операторы с пользовательской ассоциативностью и приоритетом; следовательно, анализатор приоритета операторов должен быть запущен для программы после анализа всех ссылающихся модулей.) Raku использует анализатор приоритета операторов между двумя рекурсивными спускающимися анализаторами для достижения баланса между скоростью и динамичностью. Анализаторы C и C++ в GCC, реализованные как рекурсивные спускающиеся анализаторы с ручным кодированием, ускоряются благодаря анализатору приоритета операторов, который может быстро проверять арифметические выражения. Анализаторы приоритета операторов также встраиваются в анализаторы, сгенерированные компиляторами, чтобы заметно ускорить рекурсивный спускающийся подход к анализу выражений.
Альтернативные методы
Существуют и другие способы применения правил приоритета операторов. Один из них — построить дерево, представляющее исходное выражение, а затем применить к нему правила преобразования дерева. Такие деревья не обязательно нужно реализовывать, используя традиционные структуры данных для деревьев. Вместо этого токены можно хранить в плоских структурах, например, в таблицах, одновременно формируя список приоритетов, определяющий порядок обработки элементов.