При разработке cheapack мне понадобился конвертер и после тестирования оказалось что им всем вообще до одного места как будет работать конвертированный код. Посему было принято решение написать собственное решение, которое бы учитывало все тонкости языка.
Конвертеры
Проблемы
Здесь начинается самое интересное, ибо авторы конвертеров вообще не думают о том как будет работать сконвертированный код.
В текущей версии конвертера эти проблемы решены частично, но мы работаем над этим...
Конкатенация
Наверно самая известная проблема всех конвертеров. В Lua для конкатенации строк используется оператор .. вместо привычного +. Наш конвертер полноценно выводит типы для каждого выражения, что позволяет ему применить необходимый оператор в зависимости от типа операндов:
globals
string a = "1" + "2"
string b = (("3")) + (("4"))
string c = I2S(5) + R2S(6)
string d = a + b
string e = (c) + (d)
endglobals
a = "1" .. "2"
b = (("3")) .. (("4"))
c = I2S(5) .. R2S(6)
d = a .. b
e = (c) .. (d)
Программа для конвертации jass кода в lua хотя бы догадалась применить оператор для двух строковых литералов, но уже на скобках счастье закончилось:
a = "1" .. "2"
b = (("3")) + (("4"))
c = I2S(5) + R2S(6)
d = a + b
e = (c) + (d)
cJass2Lua оказался умнее и осилил не только литералы, но и переменные. Но счастье так же быстро улетучилось, стоило появиться скобкам:
a = "1" .. "2"
b = (("3")) + (("4"))
c = I2S(5) + R2S(6)
d = a .. b
e = (c) + (d)
vJass2Lua вообще забил на оператор .., но не преминул впихнуть свой копирайт:
a = "1" + "2"
b = (("3")) + (("4"))
c = I2S(5) + R2S(6)
d = a + b
e = (c) + (d)
Ключевые слова
В Lua, зарезервированы ключевые слова, как например do и end. Только вот создателям конвертеров зачастую на это наплевать. Ведь не будете же вы запускать сконвертированный код.
Решение этого вопроса привело к созданию конвертера JASS где используется общий подход: каждому идентификатору назначается новое уникальное имя и когда наш конвертер видит зарезервированное слово он просто использует это новое имя в качестве имени переменной или функции.
globals
real do = 1
real do_ = 2
real keyword = 2
endglobals
function end takes real until returns real
local real in = do + until + keyword
return in
endfunction
function main takes nothing returns nothing
local real repeat = end(do) + end(keyword)
endfunction
a = 1
do_ = 2
keyword = 2
function d(f)
local e = a + f + keyword
return e
end
function main()
local h = d(a) + d(keyword)
end
Программа для конвертации jass кода в lua вообще забила болт и даже не удосужилась использовать простое решение с суффиксом:
do = 1
do_ = 2
keyword = 2
local function end(until)
local in = do + until + keyword
return in
end
local function main()
local repeat = end(do) + end(keyword)
end
cJass2Lua оказался ещё веселее и просто вылетал на таком коде и единственное что удалось преобразовать это переменные:
do = 1
keyword = 2
vJass2Lua оказался умнее и использовал простое решение с суффиксом. Но проверить наличие переменной с новым названием не удосужился острелив себе на do_.
do_ = 1
do_ = 2
keyword = 2
function end_(until_)
local in_ = do_ + until_ + keyword
return in_
end
function main()
local repeat_ = end_(do_) + end_(keyword)
end
Для jass-to-ts пришлось использовать ключевые слова от JavaScript, но и он не обманул моих ожиданий:
globals
constant real const = 1
endglobals
const const = 1;
Прочие проблемы...
На данный момент мне лень их описывать, но если будут желающие, то пишите комментарии.
Edited by konvan5
Попросить ввести замену или автоматически на что-то заменить?
Или просто отказаться конвертировать пока код не поправят по этой причине.