ANTLR-JASS-Kotlin: Конвертируем JASS в Lua

Added by , published
Программы
Предназначение:
Работа с кодом
При разработке 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;

Прочие проблемы...

На данный момент мне лень их описывать, но если будут желающие, то пишите комментарии.
Инструкция по использованию доступна здесь.
`
LOADING AD...
38
Краткое описание от бога🤣
А так респекты конечно, так что, можно и jc на рефордж перевести, что-ли
Replies (1)
31
ScorpioT1000, это только 0.0.* версия. Тут ещё тестить и тестить. Я вообще-то хотел в AngelScript, но с Lua оказалось проще работать.
А там возможно и до этих ваших вжасов доберусь...
25
Интересно, как решить проблему зарезервированных имен?)
Попросить ввести замену или автоматически на что-то заменить?
Или просто отказаться конвертировать пока код не поправят по этой причине.
Replies (3)
31
Интересно, как решите проблему зарезервированных имен?)
Элементарно. Я просто добавляю суффикс _anal к имени. Врятли такое имя кем-то используется. Позже всё-таки сделаю проверку на занятые имена и буду добавлять цифры чтоб достичь уникальности.
Но это когда доберусь до ужасофикации идентификаторов.
25
nazarpunk, я тоже подумал о подобном варианте для старта, но в идеале да, сделать бы проверку на существующие имена, хех. Интересный проект получается, очень полезный)
31
сделать бы проверку на существующие имена
Сделал, можешь зоценять.
31
A new version is out! Scroll to the resource
Решена проблема ключевых слов и реализован новый конвертер.
The comment is deleted
To leave a comment please sign in to the site.