У меня есть скрипт Lua 5.3 (эмулятор), который я хочу перенести в среду, используя Lua 5.2. Он использует побитовые операторы, которых нет в 5.2; вместо этого 5.2 использует функции для выполнения побитовых операций. Скрипт использует сотни этих операторов, и преобразование их вручную было бы утомительным. Есть ли способ преобразовать все операторы в файле в вызовы функций, соблюдая скобки и порядок операций? (Решение не обязательно должно быть на Lua; подойдет любой язык.)
Пример:
if mode == ROTATE_MODE_ROR then
shifts = shifts & shift
local shiftmask = (1 << shifts) - 1
cf = (vr >> ((shifts - 1) & shift)) & 0x01
vr = (vr >> shifts) | ((vr & shiftmask) << ((shift - shifts + 1) & shift))
of = ((vr >> shift) ~ (vr >> (shift - 1))) & 0x01
elseif mode == ROTATE_MODE_ROL then
shifts = shifts & shift
cf = (vr >> ((shift - shifts + 1) & shift)) & 0x01
vr = ((vr << shifts) & ((1 << (shift + 1)) - 1)) | (vr >> ((shift - shifts + 1) & shift))
of = ((vr >> shift) ~ cf) & 0x01
преобразуется в:
if mode == ROTATE_MODE_ROR then
shifts = bit32.band(shifts, shift)
local shiftmask = bit32.lshift(1, shifts) - 1
cf = bit32.band(bit32.rshift(vr, bit32.band((shifts - 1), shift)), 0x01)
vr = bit32.bor(bit32.rshift(vr, shifts), bit32.lshift((bit32.band(vr, shiftmask), bit32.band((shift - shifts + 1), shift))))
of = bit32.band(bit32.bxor(bit32.rshift(vr, shift), bit32.rshift(vr, (shift - 1))), 0x01)
elseif mode == ROTATE_MODE_ROL then
shifts = bit32.band(shifts, shift)
cf = bit32.band(bit32.rshift(vr, bit32.band((shift - shifts + 1), shift)), 0x01)
vr = bit32.bor(bit32.band(bit32.lshift(vr, shifts), (bit32.lshift(1, (shift + 1)) - 1)), bit32.rshift(vr, bit32.band((shift - shifts + 1), shift)))
of = bit32.band(bit32.bxor(bit32.rshift(vr, shift), cf), 0x01)