Грамматика приоритета операторов
Грамматика приоритета операторов — это разновидность грамматики формальных языков .
Технически грамматика приоритета операторов — это контекстно-свободная грамматика , обладающая свойством (среди прочего) [1] что ни одна продукция не имеет ни пустой правой части, ни двух соседних нетерминалов в своей правая сторона. Эти свойства позволяют отношения устанавливать старшинства. определяется между терминалами грамматики. Анализатор , использующий эти отношения, значительно проще, чем анализаторы более общего назначения, такие как анализаторы LALR . Анализаторы приоритета операторов могут быть созданы для большого класса контекстно-свободных грамматик.
Отношения старшинства
[ редактировать ]Грамматики приоритета операторов основаны на следующих трех отношениях приоритета между терминалами: [2]
Связь | Значение |
---|---|
a уступает приоритет b | |
a имеет тот же приоритет, что и b | |
a имеет приоритет над b |
Эти отношения приоритета операторов позволяют разграничивать дескрипторы в правильных формах предложений : отмечает левый конец, появляется внутри ручки, и отмечает правый конец. В отличие от других анализаторов сдвига-сокращения, все нетерминалы считаются равными с целью идентификации дескрипторов. [3] Отношения не обладают теми же свойствами, что и их аналоги без точек; е. г. вообще не подразумевает , и не следует от . Более того, вообще не соблюдается, и возможно.
Предположим, что между терминалами a i и a i +1 всегда существует ровно одно отношение предшествования. Предположим, что $ — это конец строки. Тогда для всех терминалов b определяем: и . Если мы удалим все нетерминалы и разместим правильное отношение приоритета: , , между остальными терминалами остаются строки, которые можно проанализировать легко разрабатываемым восходящим парсером .
Пример
[ редактировать ]Например, можно использовать следующие отношения приоритета операторов. быть введено для простых выражений: [4]
Они следуют из следующих фактов: [5]
- + имеет более низкий приоритет, чем * (следовательно, и ).
- И +, и * левоассоциативны (следовательно, и ).
Входная строка [4]
после добавления конечных маркеров и вставки отношений приоритета становится
Анализ приоритета операторов
[ редактировать ]Наличие отношений приоритета позволяет идентифицировать дескрипторы следующим образом: [4]
- сканируйте строку слева, пока не увидите
- сканирование назад (справа налево) по любому пока не увижу
- все между двумя отношениями и , включая любые промежуточные или окружающие нетерминалы, образует дескриптор
Обычно нет необходимости просматривать всю форму предложения, чтобы найти дескриптор.
Алгоритм анализа приоритета операторов
[ редактировать ]Приведенный ниже алгоритм взят из Aho et al.: [6]
If $ is on the top of the stack and ip points to $ then return else Let a be the top terminal on the stack, and b the symbol pointed to by ip if a b or a b then push b onto the stack advance ip to the next input symbol else if a b then repeat pop the stack until the top stack terminal is related by to the terminal most recently popped else error() end
Функции приоритета
[ редактировать ]Анализатор приоритета операторов обычно не хранит таблицу приоритетов с отношениями, которая может стать довольно большой. функции приоритета f и g . Вместо этого определены [7] Они отображают терминальные символы в целые числа, поэтому отношения старшинства между символами реализуются путем числового сравнения: должно сохраняться, если держится и т. д.
Не каждая таблица отношений предшествования имеет функции предшествования, но на практике для большинства грамматик такие функции могут быть разработаны. [8]
Алгоритм построения функций предшествования
[ редактировать ]Приведенный ниже алгоритм взят из Aho et al.: [9]
- Создайте символы f a и g a для каждого грамматического терминала a и для символа конца строки;
- Разбейте созданные символы на группы так, чтобы f a и g b находились в одной группе, если (в одной группе могут находиться символы, даже если их терминалы не связаны этим отношением);
- Создайте ориентированный граф , узлами которого являются группы. Для каждой пары терминалов сделать: поместить ребро из группы g b в группу f a , если , в противном случае, если поместите ребро из группы f a в группу g b ;
- Если построенный граф имеет цикл, то функций предшествования не существует. Если циклов нет, пусть — длина самого длинного пути из группы f a , и пусть — длина самого длинного пути из группы g a .
Пример
[ редактировать ]Рассмотрим следующую таблицу (повторенную сверху): [10]
Использование алгоритма приводит к следующему графику:
gid \ fid f* \ / g* / f+ | \ | g+ | | g$ f$
из которого мы извлекаем следующие функции предшествования по максимальным высотам в ориентированном ациклическом графе :
идентификатор + * $ ж 4 2 4 0 г 5 1 3 0
Языки приоритета операторов
[ редактировать ]Класс языков, описываемых грамматиками приоритета операторов, т. е. языков с приоритетом операторов, строго содержится в классе детерминированных контекстно-свободных языков и строго содержит языки с видимым смещением вниз . [11]
Языки с приоритетом операторов обладают многими свойствами замыкания: объединением, пересечением, дополнением, [12] конкатенация, [11] и это самый большой известный класс, замкнутый относительно всех этих операций и для которого разрешима проблема пустоты. Еще одной особенностью языков с приоритетом операторов является их локальная разборчивость. [13] что обеспечивает эффективный параллельный анализ.
Существуют также характеристики, основанные на эквивалентной форме автоматов и монадической логике второго порядка. [14]
Примечания
[ редактировать ]- ^ Ахо, Сети и Уллман 1988 , стр. 203
- ^ Ахо, Сети и Уллман 1988 , стр. 203–204
- ^ Ахо, Сети и Уллман 1988 , стр. 205–206
- ^ Jump up to: а б с Ахо, Сети и Уллман 1988 , с. 205
- ^ Ахо, Сети и Уллман 1988 , стр. 204
- ^ Ахо, Сети и Уллман 1988 , стр. 206
- ^ Ахо, Сети и Уллман 1988 , стр. 208–209
- ^ Ахо, Сети и Уллман 1988 , стр. 209
- ^ Ахо, Сети и Уллман 1988 , стр. 209–210
- ^ Ахо, Сети и Уллман 1988 , стр. 210
- ^ Jump up to: а б Креспи Региззи и Мандриоли, 2012 г.
- ^ Креспи Региззи, Мандриоли и Мартин 1978
- ^ Баренги и др. 2015 год
- ^ Лонати и др. 2015 год
Ссылки
[ редактировать ]- Ахо, Альфред В.; Сетхи, Рави; Уллман, Джеффри Д. (1988). Компиляторы — принципы, методы и инструменты . Аддисон-Уэсли.
- Креспи Региззи, Стефано; Мандриоли, Дино (2012). «Приоритет операторов и свойство визуального нажатия» . Журнал компьютерных и системных наук . 78 (6): 1837–1867. дои : 10.1016/j.jcss.2011.12.006 .
- Креспи Региззи, Стефано; Мандриоли, Дино; Мартин, Дэвид Ф. (1978). «Алгебраические свойства языков приоритета операторов» . Информация и контроль . 37 (2): 115–133. дои : 10.1016/S0019-9958(78)90474-6 .
- Баренги, Алессандро; Креспи Региззи, Стефано; Мандриоли, Дино; Панелла, Федерика; Праделла, Маттео (2015). «Параллельный анализ стал практичным» . Наука компьютерного программирования . 112 (3): 245–249. дои : 10.1016/j.scico.2015.09.002 . HDL : 11311/971391 .
- Лонати, Виолетта; Мандриоли, Дино; Панелла, Федерика; Праделла, Маттео (2015). «Языки приоритета операторов: их теоретико-автоматная и логическая характеристика». SIAM Journal по вычислительной технике . 44 (4): 1026–1088. дои : 10.1137/140978818 . hdl : 2434/352809 .
Дальнейшее чтение
[ редактировать ]- Флойд, RW (июль 1963 г.). «Синтаксический анализ и приоритет операторов» . Журнал АКМ . 10 (3): 316–333. дои : 10.1145/321172.321179 . S2CID 19785090 .
Внешние ссылки
[ редактировать ]- Николай Николаев: IS53011A Language Design and Implementation , Конспекты курса для CIS 324, 2010.