Справка: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.