Грамматика приоритета операторов - Operator-precedence grammar
An грамматика приоритета операторов это своего рода грамматика за формальные языки.
Технически грамматика приоритета операторов - это контекстно-свободная грамматика который имеет собственность (среди прочего[1]), что ни одна продукция не имеет ни пустой правой части, ни двух соседних нетерминалов в правой части. Эти свойства допускают приоритет связи быть определенным между терминами грамматики. А парсер, который использует эти отношения значительно проще, чем парсеры более общего назначения, такие как Парсеры LALR. Анализаторы приоритета операторов могут быть созданы для большого класса контекстно-свободных грамматик.
Отношения приоритета
Грамматики приоритета операторов основываются на следующих трех отношениях приоритета между терминалами:[2]
Связь | Смысл |
---|---|
а уступает приоритет б | |
а имеет тот же приоритет, что и б | |
а имеет приоритет над б |
Эти отношения приоритета операторов позволяют ограничивать ручки в правильные предложения: отмечает левый конец, появляется внутри ручки, и отмечает правый конец. В отличие от других анализаторов сдвига-сокращения, все нетерминалы считаются равными с целью идентификации дескрипторов.[3]Отношения не обладают теми же свойствами, что и их аналоги без точек; e. грамм. обычно не подразумевает , и не следует из . Более того, обычно не выполняется, и возможно.
Предположим, что между выводами ая и ая+1 всегда существует ровно одно отношение предшествования. Предположим, что $ - конец строки. Тогда для всех терминалов б мы определяем: и . Если мы переместим все нетерминалы и разместим правильное отношение приоритета:, , между остальными терминалами остаются струны, которые можно проанализировать легко разработанным восходящий парсер.
Пример
Например, для простых выражений можно ввести следующие отношения приоритета операторов:[4]
Они вытекают из следующих фактов:[5]
- + имеет более низкий приоритет, чем * (следовательно, и ).
- И +, и * являются левоассоциативный (следовательно и ).
Входная строка[4]
после добавления маркеров конца и вставки отношений приоритета становится
Анализ приоритета оператора
Наличие отношений приоритета позволяет идентифицировать дескрипторы следующим образом:[4]
- просканируйте строку слева, пока не увидите
- сканировать назад (справа налево) по любому пока не увидишь
- все между двумя отношениями и , включая любые промежуточные или окружающие нетерминалы, образует ручку
Обычно нет необходимости сканировать весь сентенциальная форма найти ручку.
Алгоритм синтаксического анализа приоритета оператора[6]
Инициализация: установите ip так, чтобы он указывал на первый символ w $. Повторить: если $ находится на вершине стека, а ip указывает на $, тогда верните else. Пусть a будет верхним терминалом в стеке, а b - символом, на который указывает ip. если б или а b, затем нажмите b в стек, продвиньте ip к следующему входному символу, иначе, если a b, затем повторите выталкивание стека, пока верхний терминал стека не будет связан к терминалу недавно появилось сообщение else error () end
Функции приоритета
Парсер приоритета операторов обычно не хранит таблицу приоритетов с отношениями, которые могут стать довольно большими. ж и грамм определены.[7]Они отображают терминальные символы в целые числа, и поэтому отношения приоритета между символами реализуются путем численного сравнения: должен держаться, если держит и т. д.
Не каждая таблица отношений приоритета имеет функции приоритета, но на практике для большинства грамматик такие функции могут быть созданы.[8]
Алгоритм построения функций приоритета[9]
- Создать символы жа и грамма для каждого грамматического терминала а и для символа конца строки;
- Разделите созданные символы на группы так, чтобы жа и граммб находятся в одной группе, если (в одной группе могут быть символы, даже если их выводы не связаны этим отношением);
- Создать ориентированный граф чьи узлы являются группами. Для каждой пары клемм делать: разместить ребро из группы граммб к группе жа если , иначе, если поставить край из группы жа к тому из граммб;
- Если у построенного графа есть цикл, то функций приоритета не существует. Когда нет циклов, пусть быть длиной самый длинный путь из группы жа и разреши быть длиной самого длинного пути из группы грамма.
Пример
Рассмотрим следующую таблицу (повторенную сверху):[10]
Использование алгоритма приводит к следующему графику:
gid fid f * / g * / f + | | г + | | g $ f $
из которого мы извлекаем следующие функции приоритета из максимальных высот в ориентированный ациклический граф:
я бы + * $ ж 4 2 4 0 грамм 5 1 3 0
Языки приоритета операторов
Класс языков, описываемых грамматиками приоритета операторов, т. Е. Языков приоритета операторов, строго содержится в классе детерминированные контекстно-свободные языки, и строго содержит явно выталкивающие языки.[11]
Языки с приоритетом операторов обладают многими свойствами замыкания: объединение, пересечение, дополнение,[12] конкатенация[11] и они представляют собой самый большой из известных классов, закрытых для всех этих операций и для которых проблема пустоты разрешима. Еще одна особенность языков с приоритетом операторов - их локальный анализ,[13] что обеспечивает эффективный параллельный анализ.
Существуют также описания, основанные на эквивалентной форме автоматов и монадической логике второго порядка.[14]
Примечания
- ^ Ахо, Сетхи и Ульман, 1988, стр. 203.
- ^ Ахо, Сетхи и Ульман, 1988, стр. 203-204.
- ^ Ахо, Сетхи и Ульман, 1988, стр. 205-206.
- ^ а б c Ахо, Сетхи и Ульман, 1988, стр. 205.
- ^ Ахо, Сетхи и Ульман, 1988, стр. 204.
- ^ Ахо, Сетхи и Ульман, 1988, стр. 206.
- ^ Ахо, Сетхи и Ульман, 1988, стр. 208-209.
- ^ Ахо, Сетхи и Ульман, 1988, стр. 209.
- ^ Ахо, Сетхи и Ульман, 1988, стр. 209–210.
- ^ Ахо, Сетхи и Ульман, 1988, стр. 210.
- ^ а б Креспи Регицци и Мандриоли 2012
- ^ Креспи Регицци, Мандриоли и Мартин 1978
- ^ Баренги и др. 2015 г.
- ^ Lonati et al. 2015 г.
Рекомендации
- Ахо, Альфред В., Сетхи, Рави и Ульман, Джеффри Д. (1988). Компиляторы - принципы, методы и инструменты. Эддисон-Уэсли.
- Флойд, Р. В. (Июль 1963 г.). «Синтаксический анализ и приоритет операторов». Журнал ACM. 10 (3): 316–333. Дои:10.1145/321172.321179.
- Креспи Регицци, Стефано; Мандриоли, Дино (2012). «Приоритет оператора и свойство видимого раскрытия». Журнал компьютерных и системных наук. 78 (6): 1837–1867. Дои:10.1016 / j.jcss.2011.12.006.CS1 maint: ref = harv (связь)
- Креспи Регицци, Стефано; Мандриоли, Дино; Мартин, Дэвид Ф. (1978). «Алгебраические свойства языков приоритета операторов». Информация и контроль. 37 (2): 115–133. Дои:10.1016 / S0019-9958 (78) 90474-6.CS1 maint: ref = harv (связь)
- Баренги, Алессандро; Креспи Регицци, Стефано; Мандриоли, Дино; Панелла, Федерика; Праделла, Маттео (2015). «Параллельный анализ стал практичным». Наука компьютерного программирования. 112 (3): 245–249. Дои:10.1016 / j.scico.2015.09.002.CS1 maint: ref = harv (связь)
- Лонати, Виолетта; Мандриоли, Дино; Панелла, Федерика; Праделла, Маттео (2015). "Языки приоритета операторов: их автоматно-теоретическая и логическая характеризация". SIAM Журнал по вычислениям. 44 (4): 1026–1088. Дои:10.1137/140978818. HDL:2434/352809.CS1 maint: ref = harv (связь)
внешняя ссылка
- Николай Николаев: IS53011A Разработка и реализация языка, Курс для CIS 324, 2010.