我正在尝试编写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")