我应该如何在 Web 汇编中实现"else if"?



我正在构建一个项目,该项目使用ANTLR来解析我创建的自定义语言语法,我的任务是将这些代码编译/转换为Web Assembly。

这是一段示例代码,我可以尝试使用程序转换:

if (<condition>) {
<some code>
}
else if (<condition>) {
<some code>
}
else {
<some code>
}

我对Web Assembly一点经验都没有,但这是该项目的一项要求。"如果"one_answers"其他"的陈述似乎相当直截了当,我唯一的问题是"其他如果"的陈述。

我认为实现它的唯一方法是将所有"else-if"语句嵌套在它上面的选择的"else"子句中,因为似乎没有任何web程序集语法支持直接的"else-if"语句。

任何可以提出的建议都将是美妙的,干杯。

我认为实现它的唯一方法是将所有"else-if"语句嵌套在上方选择的"else"子句中

是的,你就是这么做的。

附言:你可能有兴趣知道,许多语言实际上并没有专门的else-if语法。例如,在C及其许多子代中,if语句的语法如下:

statement: 'if' '(' expression ')' statement ('else' statement)?

所以一个else if就是后面跟一个if语句的else。因此,即使在许多语言的语法级别上,else if也只是else分支中的if语句。

由于您的语法看起来很相似,您可能也可以用这种方式编写语法,因此您根本不需要做任何事情来支持else ifs。

我认为实现它的唯一方法是嵌套所有"else-if"上方选择的"其他"条款中的语句

是的,这是一种完全有效的方法。但是,除了ifelse指令外,还可以选择使用select,它根据条件返回第一个或第二个操作数。

要了解其他语言是如何解决这个问题的,我建议使用WebAssembly Studio。

例如,以下ActionScript代码:

export function if_else_test(input: i32): i32 {
if (input > 10) {
return 101;
} else if (input > 20) {
return 102;
} else {
return 103;
}
}

编译如下:

(func $if_else_test (export "if_else_test") (type $t1) (param $p0 i32) (result i32)
i32.const 101
i32.const 102
i32.const 103
get_local $p0
i32.const 20
i32.gt_s
select
get_local $p0
i32.const 10
i32.gt_s
select)

上面的代码用三个不同的返回值加载堆栈,然后使用两个select语句根据两个if条件返回正确的值。

尽管如果使用"函数调用"语法重新编写,逻辑可能更容易遵循:

(func $if_else_test (export "if_else_test") (type $t1) (param $p0 i32) (result i32)
(select
(i32.const 101)
(select 
(i32.const 102)
(i32.const 103)
(i32.gt_s
(i32.const 20)
(get_local $p0)
)
)
(i32.gt_s
(i32.const 10)
(get_local $p0)
)
)

相关内容

  • 没有找到相关文章

最新更新