使用+运算符将javascript binaryExpression转换为bash等效项

时间:2019-06-01 17:38:09

标签: javascript bash typescript compiler-construction transpiler

我正在尝试编写PoC Typescript / javascript来打击bash transpiler。 (我几乎没有编写编译器或编译器的背景)

我正在使用打字稿编译器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"

但是在进行迭代时以及当我位于(a +?)的BinaryExpression节点中时,我没有办法实现标识符是数字还是右侧操作数的输出将是字符串。而且我不能保留'+'运算符,因为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")

0 个答案:

没有答案