Справка:Lua/LPeg

Материал из свободной русской энциклопедии «Традиция»
Перейти к навигации Перейти к поиску
LPeg-logo.gif
Портал сообщества · К администраторам · Изменение прав участников · К бюрократам · Защита страниц · К удалению · Ревизия страниц · Проверка участников · Голосования · Техпомощь
Написание статей Написание статей
Тематические статьи
Техническая справка
Общие правила

Список правил и руководств Справка

LPeg — библиотека Lua, дающая доступ к грамматикам, разбирающим выражение (PEG), написанная Роберту Иерусалимски.

Грамматики и образцы могут собираться и применяться двумя путями: с помощью комбинации вложенных методов LPeg и перегруженных операций и с помощью строкового синтаксиса, приближённого к традиционному синтаксису PEG, предоставляемого модулем re.

Обзор основных функций[править код]

Синтаксис LPeg[о 1] Синтаксис re[о 2] Описание
Подключение и инициализация
local lpeg = require "lpeg" local re = require "Модуль:re" Подключение модуля
local pattern = re.compile (string) Компиляция образца из синтаксиса re
Создание образцов и грамматик
Простые образцы
( p ) ( p ) Группировка
lpeg.P ('строка') или
'строка'
'строка' или "строка" Буквальное совпадение строки
lpeg.S ('символы') [символы] Множество символов
-lpeg.S ('символы') [^символы] Множество символов, кроме указанных
lpeg.R ('символ1символ2') [символ1-символ2] Интервал символов символ1-символ2
lpeg.P (1) или
1
. Любой символ
lpeg.P (n) или
n
.^n Точно n любых символов
lpeg.P (-1) или
-1
!. Конец ввода
lpeg.P (true) или
true
Всегда совпадает, не поглощая ввод
lpeg.P (false) или
false
Никогда не совпадает, не поглощая ввод
defs ['индекс'] %индекс Образец defs ['индекс']
#p &p Предикат «и», проверяющий ввод на соответствие p, но не поглощающий его
-p !p Предикат «не», проверяющий ввод на несоответствие p, но не поглощающий его
lpeg.B (p) <p[о 3] Предикат, срабатывающий, если ввод перед текущей позицией удовлетворяет образцу p, который должен быть фиксированной длины и не содержать захватов, не поглощающий ввод
p1 * p2 p1 p2 Конкатенация образцов p1 и p2: после проверки первого и поглощения ввода, проверяется второй
p1 + p2 p1 / p2 Упорядоченный выбор: p2 будет проверен, только если p1 не найден
p1 - p2 !p2 p1 Проверка, что условие p2 не выполняется, без поглощения ввода, затем проверка p1
Повторы
p^-1 p? Один или ни одного повтора p
p^0 p* Любое число или ни одного повтора p
p^1 p+ Не менее одного повтора p
Эмулируется Lua p^n Точно n повторов p
p^n p^+n Не менее n повторов p
p^-n p^-n Не более n повторов p
Захваты
{/regular expression/flags} или {pcre/regular expression/flags}[о 3] PERL-совместимое регулярное выражение
lpeg.Cp () {} Захват позиции
lpeg.C (p) { p } Простой захват
lpeg.Cg (p) {: p :} Анонимный групповой захват
lpeg.Cg (p, name) {:name: p :} Именованный групповой захват
lpeg.Cs (p) {~ p ~} Захват с заменой
lpeg.Ct (p) {| p |} Захват в таблицу
lpeg.Cc (value1, ...) {` value `}[о 3] Захват, возвращающий переданную константу
lpeg.Carg (n) {# name #}[о 3] Захват, возвращающий дополнительный аргумент к lpeg.match () или строку defs['name']
lpeg.Cb (name) =name Ссылка на последний захват name
p / 'строка' p -> 'строка' или
p -> "строка" или
p -> name
Строковый захват: последовательности %n в переданной константной строке или в строке defs['name'] заменяются n-ным захватом
p / n p -> n Возвращается n-ный захват
p / f p -> funcname Возвращается значение функции f или defs['funcname'], которой переданы захваты в p
p % f p >> funcname Собирающий захват: в функцию f передаются последний захват перед p и захваты из p; первое возвращённое значение f заменяет последний захват перед p; если p не срабатывает, сохраняется последний захват. Этот захват реомендуется использовать вместо устаревшего lpeg.Cf (p, f).

Рекомендуется не включать прямо в p / 'строка', p / n, lpeg.Cs (p) или lpeg.Cf (p, f); как правило, достаточно обернуть в анонимный групповой захват lpeg.Cg (p).

p / t p -> tabname Возвращается значение таблицы t или defs['tabname'] по индексу, равному первому захвату или всему образцу, если захватов нет
lpeg.Cmt (p, f) p => funcname Немедленный захват, после которого вызывается функция f или defs['funcname'], которой передаётся вся обрабатываемая строка, позиция после совпадения p и все захваты p
lpeg.P (f) => funcname Немедленный захват, всегда успешный и не поглощающий ввод
lpeg.Cf (p, f) p ~> funcname Захват со свёрткой функцией f; устарело, рекомендуется замена %: lpeg.Cf (p1 * p2 ^ 0, func)(p1 * (p2 % func) ^ 0).
Грамматики
lpeg.V ('name') name или
<name>
Нетерминальный символ name в грамматике
local name = lpeg.P (t) (name <- p)+ Грамматика, где t — таблица с правилами
Разбор строк с помощью образцов и грамматик
pattern:match (subject [, init]) Возвращает позицию после совпадения pattern в subject, начиная с init
re.match (subject, pattern [, init]) Возвращает все захваты pattern в subject, начиная с init
re.find (subject, pattern [, init]) Возвращает позиции начала и конца совпадения pattern в subject, начиная с init, или nil
re.gsub (subject, pattern, replacement) Глобальная замена pattern на replacement в subject
  1. p здесь означает образец или грамматику, созданную с помощью методов LPeg и перегруженных операций.
  2. p здесь означает строку, содержащую образец или грамматику в синтаксисе re. Предполагается, что в вызов re.compile ('образец', defs) передана таблица определений прекомпилированных образцов, таблиц и функций defs.
  3. а б в г Расширение re в «Традиции».

Ссылки[править код]