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