Справка:Lua/LPeg
|
|
| ||
|---|---|---|
| Тематические статьи | ||
| Техническая справка | ||
Тэги MediaWiki: | ||
| Общие правила | ||
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 / 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
| |
- ↑
pздесь означает образец или грамматику, созданную с помощью методов LPeg и перегруженных операций. - ↑
pздесь означает строку, содержащую образец или грамматику в синтаксисе re. Предполагается, что в вызовre.compile ('образец', defs)передана таблица определений прекомпилированных образцов, таблиц и функцийdefs. - ↑ а б в г Расширение
reв «Традиции».
СсылкиПравить
- Справка на английском.
- LPeg. Parsing Expression Grammars For Lua, version 0.12.
- Исходный код.
- Sérgio Medeiros, Roberto Ierusalimschy «A Parsing Machine for PEGs». — Рио-де-Жанейро
- Roberto Ierusalimschy «A Text Pattern-Matching Tool based on Parsing Expression Grammars» // Software: Practice and Experience. — 2008.
- Lpeg Tutorial.
- Lpeg Recipes.
