Мне нужен инструмент для разбора табличных выражений Lua. Если ничего не помогает, я в конце концов просто закодирую небольшой модуль Lua для преобразования таблиц в XML, но на данный момент я заинтересован в том, чтобы библиотека Ruby делала это, но в противном случае я бы принял инструмент на любом языке, при условии, что я можно посмотреть на его источник.
Вот пример фрагмента (это вывод аддона WoW):
CT_RaidTracker_RaidLog = {
{
["PlayerInfos"] = {
["Nyim"] = {
["race"] = "Orc",
["guild"] = "Excubitores Noctae",
["sex"] = 2,
["class"] = "HUNTER",
["level"] = 70,
},
["Zyrn"] = {
["race"] = "BloodElf",
["guild"] = "Excubitores Noctae",
["sex"] = 2,
["class"] = "WARLOCK",
["level"] = 70,
},
...
Основная идея — вложенные ассоциативные массивы. Любая помощь или указатель будут рассмотрены, любая идея приветствуется.
EDIT #1
Из-за споров позвольте мне пояснить, что я пробовал. Я дополнил цепочку замены строки/регулярного выражения, предоставленную одним из участников, например так:
str.gsub(/--.+$/, "").gsub("=", ":").gsub(/[\[\]]/,"").gsub('" :','":').gsub(/,\s*\n(\s*)}/, "\n\\1}")
Я (1) добавил удаление комментариев Lua, (2) заменил один из заменителей регулярных выражений: когда у вас есть последний элемент в объекте/массиве, после него все еще есть запятая, поэтому ее необходимо закрыть, а запятую правильно удалить .
Вы заметили двойные открывающие фигурные скобки? JSON не любит анонимные объекты. Это выглядит так:
"xxx" = {
{
["aaa"} = {
["bbb"] = {
"ccc" = 7
"ddd" = "a string"
"eee" = "a date/time pattern"
}
},
["qqq"} = {
"hm" = "something"
}
},
{
["aaa"] = {
-- ...
},
["qqq"] = {
-- ...
}
}
}
По сути, на корневом уровне у нас есть список/массив похожих объектов, оба из которых имеют разделы «aaa» и «qqq», чтобы следовать примеру. Однако в Lua это явно разрешено, а в JSON — нет. Потому что открывающие фигурные скобки обрабатываются как «запустить объект», но у этого объекта нет имени.
Я попытался обнаружить этот случай с помощью регулярного выражения и заменить фигурные скобки парами «[]». Хотя результирующее регулярное выражение работало, проблема оставалась той же: хорошо, вместо этого мы определяем массив похожих объектов, но объявление массива по-прежнему безымянно.
Возможным решением было бы вместо обнаружения и замены этих фигурных скобок на [] окрестить объекты индексами, например: "0" = { "aaa" = {...} }, "1" = { "aaa" = {... } }
и т. д. Этот (надеюсь, окончательный) обходной путь, вероятно, заставит его работать... Сообщу еще раз. ;)
function foo() return 1 end table = {[2-foo()] = 't'..'wo'}
, но ее будет сложнее (правильно) проанализировать, чем пример, который вы разместили. - person Bart Kiers   schedule 03.03.2010