Я пытаюсь написать PoC typcript / javascript для bash транспортера.(У меня практически нет опыта написания компиляторов или транспортеров)
Я использую API компилятора машинописи для создания и анализа дерева разбора.
Я могу конвертировать простые выражения в bash какследующим образом:
let a =1
let b=2;
let c = (a+(b*2));
console.log(c,"d",1);
переносится в:
a=1
b=2
c=($(($a + ($(($b * 2))))))
echo "$c" "d" 1
Но я не знаю, как преобразовать оператор конкатенации, поскольку в bash нет оператора конкатенации и способа конкатенации в немbash - это "$ word1 $ word2".
, например:
let strLitIdentifier = "abc"
let a3 = a + ((2*3)+strLitIdentifier)
Теперь ожидаемый результат будет:
strLitIdentifier="abc"
a3="$a$((2 * 3))$strLitIdentifier"
Но при повторении и когда яв узле BinaryExpression (a +?) у меня нет способа понять, является ли идентификатор числом или выводом из правого операнда будет строка.И я не могу оставить оператор «+», так как bash не использует «+» для объединения.
из комментариев @Ed Morton, я смог добиться небольшого прогресса, используя метод typeof, но:
let a = 1 + 1; #works, output: 2
let b = 1 + "a"; #works, output: 1a
let c = 1 + "1"; #Invalid, output: 2, expected: 11
Пример сгенерированного кода:
function bashtype_is_num {
local re='^[0-9]+$'
if ! [[ $1 =~ $re ]] ; then
echo "NaN"
else
echo "NUMBER"
fi
}
function bashtype_add_or_concat {
if [[ $(bashtype_is_num $1) == "NUMBER" && $(bashtype_is_num $2) == "NUMBER" ]]; then
echo $(($1 + $2))
else
echo "$1$2"
fi
}
a=$(bashtype_add_or_concat 1 1)
b=$(bashtype_add_or_concat 1 "a")
c=$(bashtype_add_or_concat 1 "1")