---@meta lpeg

--------------------------------------------------------------------------------
-- LPeg 1.1.0 模式匹配模块
--------------------------------------------------------------------------------

---@alias lpeg_match_time_function fun(subject:string, position:integer, ...:any):integer|boolean|nil, ...
---@alias lpeg_fold_function fun(acc:any, value:any, ...:any):any, ...
---@alias lpeg_capture_function fun(...:any):any, ...
---@alias lpeg_capture_replacement string|integer|table<any, any>|lpeg_capture_function
---@alias lpeg_pattern_convertible lpeg_pattern|string|number|boolean|table<any, any>|lpeg_match_time_function

---@class lpeg_pattern*
---@operator add(lpeg_pattern_convertible): lpeg_pattern
---@operator sub(lpeg_pattern_convertible): lpeg_pattern
---@operator mul(lpeg_pattern_convertible): lpeg_pattern
---@operator div(lpeg_capture_replacement): lpeg_pattern
---@operator mod(lpeg_fold_function): lpeg_pattern
---@operator pow(integer): lpeg_pattern
---@operator unm: lpeg_pattern
---@operator len: lpeg_pattern
local pattern = {}

--- 从当前位置尝试匹配 subject。
---@param subject string 输入字符串
---@param init? integer 起始位置，负数从末尾计数
---@param ... any 传给 `Carg` 的额外参数
---@return any ... 捕获值；没有捕获时返回下一个位置；失败时返回 nil
function pattern:match(subject, init, ...) end

--- 输出 pattern 的树结构，用于调试。
function pattern:ptree() end

--- 输出 pattern 的字节码，用于调试。
function pattern:pcode() end

---@class lpeg_locale_table*
---@field alnum lpeg_pattern 字母或数字
---@field alpha lpeg_pattern 字母
---@field cntrl lpeg_pattern 控制字符
---@field digit lpeg_pattern 数字
---@field graph lpeg_pattern 图形字符
---@field lower lpeg_pattern 小写字母
---@field print lpeg_pattern 可打印字符
---@field punct lpeg_pattern 标点字符
---@field space lpeg_pattern 空白字符
---@field upper lpeg_pattern 大写字母
---@field xdigit lpeg_pattern 十六进制数字

---@class lpeg*
---@field version string LPeg 版本字符串
---@type lpeg*
local M = {}

M.version = "LPeg 1.1.0"

--- 从当前位置尝试匹配 subject。
---@param patt lpeg_pattern pattern
---@param subject string 输入字符串
---@param init? integer 起始位置，负数从末尾计数
---@param ... any 传给 `Carg` 的额外参数
---@return any ... 捕获值；没有捕获时返回下一个位置；失败时返回 nil
function M.match(patt, subject, init, ...) end

--- 如果 value 是 LPeg pattern，返回字符串 `"pattern"`；否则返回 nil。
---@param value any 待检查值
---@return string? type 类型名
function M.type(value) end

--- 设置 LPeg 回溯栈上限。
---@param max integer 最大回溯层数
function M.setmaxstack(max) end

--- 将值转换为 pattern。
---
--- 字符串按字面量匹配；非负数字匹配固定字符数；负数表示否定的固定长度匹配；
--- 布尔值生成永真/永假 pattern；表会被解释为 grammar；函数会被解释为匹配时捕获。
---@param value lpeg_pattern_convertible 可转换为 pattern 的值
---@return lpeg_pattern pattern pattern
function M.P(value) end

--- 创建 behind predicate。
---@param patt lpeg_pattern_convertible pattern
---@return lpeg_pattern pattern pattern
function M.B(patt) end

--- 创建 grammar 变量引用。
---@param v any grammar 规则索引
---@return lpeg_pattern pattern pattern
function M.V(v) end

--- 创建字符范围 pattern。
---@param ... string 范围字符串，每个字符串长度为 2，例如 `"09"`、`"az"`
---@return lpeg_pattern pattern pattern
function M.R(...) end

--- 创建字符集合 pattern。
---@param chars string 字符集合
---@return lpeg_pattern pattern pattern
function M.S(chars) end

--- 创建 UTF-8 code point 范围 pattern。
---@param cp1 integer 起始 code point
---@param cp2 integer 结束 code point
---@return lpeg_pattern pattern pattern
function M.utfR(cp1, cp2) end

--- 创建或填充当前 locale 的字符类 pattern 表。
---@generic T: table
---@param table? T 要填充的表；省略时创建新表
---@return T|lpeg_locale_table table locale 字符类表
function M.locale(table) end

--- 创建简单捕获，捕获 patt 匹配到的子串。
---@param patt lpeg_pattern_convertible pattern
---@return lpeg_pattern pattern pattern
function M.C(patt) end

--- 创建参数捕获，捕获 `match` 调用中的第 n 个额外参数。
---@param n integer 额外参数序号
---@return lpeg_pattern pattern pattern
function M.Carg(n) end

--- 创建 back capture，捕获最近的同名 group capture。
---@param key any group capture 名称
---@return lpeg_pattern pattern pattern
function M.Cb(key) end

--- 创建常量捕获。
---@param ... any 常量值
---@return lpeg_pattern pattern pattern
function M.Cc(...) end

--- 创建 fold capture。
---@param patt lpeg_pattern_convertible pattern
---@param func lpeg_fold_function 折叠函数
---@return lpeg_pattern pattern pattern
function M.Cf(patt, func) end

--- 创建 group capture。
---@param patt lpeg_pattern_convertible pattern
---@param key? any group 名称
---@return lpeg_pattern pattern pattern
function M.Cg(patt, key) end

--- 创建位置捕获。
---@return lpeg_pattern pattern pattern
function M.Cp() end

--- 创建 substitution capture。
---@param patt lpeg_pattern_convertible pattern
---@return lpeg_pattern pattern pattern
function M.Cs(patt) end

--- 创建 table capture。
---@param patt lpeg_pattern_convertible pattern
---@return lpeg_pattern pattern pattern
function M.Ct(patt) end

--- 创建 match-time capture。
---@param patt lpeg_pattern_convertible pattern
---@param func lpeg_match_time_function 匹配时函数
---@return lpeg_pattern pattern pattern
function M.Cmt(patt, func) end

--- 输出 pattern 的树结构，用于调试。
---@param patt lpeg_pattern pattern
function M.ptree(patt) end

--- 输出 pattern 的字节码，用于调试。
---@param patt lpeg_pattern pattern
function M.pcode(patt) end

return M
