Транспортируйте javascript binaryExpression с оператором + в эквивалент bash - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь написать 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")
...