Spec-Zone.ru › Elisp

Грамматики приоритета операторов

Грамматики приоритета SMIE присваивают каждому токену пару приоритетов: приоритет слева и приоритет справа. Мы говорим T1 < T2, если приоритет справа токена T1 меньше приоритета слева токена T2. Хороший способ понять это < – это как вид скобок: если мы находим ... T1 something T2 ..., то это следует интерпретировать как ... T1 (something T2 ..., а не как ... T1 something) T2 .... Последняя интерпретация имела бы место, если бы у нас было T1 > T2. Если у нас есть T1 = T2, это означает, что токен T2 следует за токеном T1 в одной и той же синтаксической конструкции, поэтому обычно у нас есть "begin" = "end". Таких пар приоритетов достаточно для выражения левой или правой ассоциативности инфиксных операторов, вложенности токенов, как скобок, и многих других случаев.

Функция: smie-prec2->grammar таблица

Эта функция принимает грамматику prec2 таблица и возвращает список, подходящий для использования в smie-setup. Сама грамматика prec2 таблица должна быть построена одной из функций ниже.

Функция: smie-merge-prec2s &rest таблицы

Эта функция принимает несколько таблиц prec2 таблицы и объединяет их в новую таблицу prec2.

Функция: smie-precs->prec2 precs

Эта функция строит таблицу prec2 из таблицы приоритетов precs. precs должна быть отсортированным списком по приоритету (например, "+" будет идти перед "*"), элементами вида (assoc op ...), где каждый op — это токен, выполняющий роль оператора; assoc — это его ассоциативность, которая может быть либо left, либо right, либо assoc, либо nonassoc. Все операторы в данном элементе имеют один и тот же уровень приоритета и ассоциативность.

Функция: smie-bnf->prec2 bnf &rest resolvers

Эта функция позволяет указать грамматику с помощью нотации BNF. Она принимает описание грамматики bnf вместе с набором правил разрешения конфликтов resolvers и возвращает таблицу prec2.

bnf — это список определений нетерминалов вида (nonterm rhs1 rhs2 ...), где каждый rhs — это (непустой) список терминалов (т.е. токенов) или нетерминалов.

Не все грамматики принимаются:

  • rhs не может быть пустым списком (пустой список никогда не нужен, поскольку SMIE позволяет всем нетерминалам совпадать с пустой строкой).
  • rhs не может содержать 2 последовательных нетерминала: каждая пара нетерминалов должна быть разделена терминалом (т.е. токеном). Это фундаментальное ограничение грамматик приоритета операторов.

Кроме того, могут возникнуть конфликты:

  • Возвращаемая таблица prec2 содержит ограничения между парами токенов, и для любой пары может быть только одно ограничение: T1 < T2, T1 = T2 или T1 > T2.
  • Токен может быть opener (что-то подобное открывающей скобке), closer (как закрывающая скобка) или neither из двух (например, инфиксный оператор или внутренний токен, например, "else").

Конфликты приоритетов могут быть разрешены с помощью resolvers, которые представляют собой список таблиц precs (см. smie-precs->prec2): для каждого конфликта приоритетов, если эти precs таблицы указывают на определённое ограничение, то конфликт разрешается с использованием этого ограничения, в противном случае конфликт сообщается, и одно из конфликтующих ограничений выбирается произвольно, а другие просто игнорируются.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Operator-Precedence-Grammars.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API