Я делаю библиотеку сериализации для Lua и использую LPeg для разбора строки. У меня работают пары K/V (с явно названным ключом), но теперь я собираюсь добавить автоиндексацию.
Это будет работать так:
@"value"
@"value2"
Будет оценивать
{
[1] = "value"
[2] = "value2"
}
У меня уже работает сопоставление значений (строки, таблицы, числа и логические значения работают отлично), поэтому мне не нужна помощь с этим; то, что я ищу, это индексация. Для каждого совпадения с @[шаблон значения] он должен фиксировать количество найденных @[шаблон значения] - другими словами, я могу сопоставить последовательность значений ("@"значение1" @"значение2"), но я не не знаю, как присвоить им индексы в соответствии с количеством совпадений.Если это недостаточно ясно, просто прокомментируйте, и я попытаюсь объяснить это лучше.
Вот как выглядит мой текущий шаблон (с использованием сжатой нотации):
local process = {} -- Process a captured value
process.number = tonumber
process.string = function(s) return s:sub(2, -2) end -- Strip of opening and closing tags
process.boolean = function(s) if s == "true" then return true else return false end
number = [decimal number, scientific notation] / process.number
string = [double or single quoted string, supports escaped quotation characters] / process.string
boolean = P("true") + "false" / process.boolean
table = [balanced brackets] / [parse the table]
type = number + string + boolean + table
at_notation = (P("@") * whitespace * type) / [creates a table that includes the key and value]
Как вы можете видеть в последней строке кода, у меня есть функция, которая делает это:
k,v matched in the pattern
-- turns into --
{k, v}
-- which is then added into an "entry table" (I loop through it and add it into the return table)
t[#t+1]=matched_value
? Это будет работать даже с простым сопоставлением шаблонов Lua. - person jpjacobs   schedule 23.10.2013p=function(s)local t={} for m in s:gmatch('@([^@]*)') do t[#t+1]=loadstring('return '..m)()end return t end
. Возможно, потребуется некоторая очистка для правильной песочницы и совместимости с 5.2, но вы поняли. В качестве примера использования:p('@"blah" @1 @print @function(x)return x*2 end')
все, что не @, является значением. - person jpjacobs   schedule 23.10.2013Ct([matches])
, посчитать их и вставить, но быстрее и красивее сделать это из LPeg. - person Caleb P   schedule 23.10.2013@"value"\n
? - person greatwolf   schedule 23.10.2013@[whitespace?]"value"[whitespace]@"value2"
. Я отредактировал свой оригинальный пост с дополнительной информацией :) - person Caleb P   schedule 23.10.2013@
, потому что каждое совпадение будет повторно использовать его и заменять старый результат в таблице захвата. Если текущая созданная таблица не имеет желаемой индексированной формы, как она выглядит в настоящее время? - person greatwolf   schedule 24.10.2013