Грамматика приоритета операторов - 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]

  1. Создать символы жа и грамма для каждого грамматического терминала а и для символа конца строки;
  2. Разделите созданные символы на группы так, чтобы жа и граммб находятся в одной группе, если (в одной группе могут быть символы, даже если их выводы не связаны этим отношением);
  3. Создать ориентированный граф чьи узлы являются группами. Для каждой пары клемм делать: разместить ребро из группы граммб к группе жа если , иначе, если поставить край из группы жа к тому из граммб;
  4. Если у построенного графа есть цикл, то функций приоритета не существует. Когда нет циклов, пусть быть длиной самый длинный путь из группы жа и разреши быть длиной самого длинного пути из группы грамма.

Пример

Рассмотрим следующую таблицу (повторенную сверху):[10]

Использование алгоритма приводит к следующему графику:

    gid  fid f *  / g * / f + |  | г + | | g $ f $

из которого мы извлекаем следующие функции приоритета из максимальных высот в ориентированный ациклический граф:

я бы+*$
ж4240
грамм5130

Языки приоритета операторов

Класс языков, описываемых грамматиками приоритета операторов, т. Е. Языков приоритета операторов, строго содержится в классе детерминированные контекстно-свободные языки, и строго содержит явно выталкивающие языки.[11]

Языки с приоритетом операторов обладают многими свойствами замыкания: объединение, пересечение, дополнение,[12] конкатенация[11] и они представляют собой самый большой из известных классов, закрытых для всех этих операций и для которых проблема пустоты разрешима. Еще одна особенность языков с приоритетом операторов - их локальный анализ,[13] что обеспечивает эффективный параллельный анализ.

Существуют также описания, основанные на эквивалентной форме автоматов и монадической логике второго порядка.[14]

Примечания

  1. ^ Ахо, Сетхи и Ульман, 1988, стр. 203.
  2. ^ Ахо, Сетхи и Ульман, 1988, стр. 203-204.
  3. ^ Ахо, Сетхи и Ульман, 1988, стр. 205-206.
  4. ^ а б c Ахо, Сетхи и Ульман, 1988, стр. 205.
  5. ^ Ахо, Сетхи и Ульман, 1988, стр. 204.
  6. ^ Ахо, Сетхи и Ульман, 1988, стр. 206.
  7. ^ Ахо, Сетхи и Ульман, 1988, стр. 208-209.
  8. ^ Ахо, Сетхи и Ульман, 1988, стр. 209.
  9. ^ Ахо, Сетхи и Ульман, 1988, стр. 209–210.
  10. ^ Ахо, Сетхи и Ульман, 1988, стр. 210.
  11. ^ а б Креспи Регицци и Мандриоли 2012
  12. ^ Креспи Регицци, Мандриоли и Мартин 1978
  13. ^ Баренги и др. 2015 г.
  14. ^ 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 (связь)

внешняя ссылка