我正在构建一个项目,该项目使用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 if
s。
我认为实现它的唯一方法是嵌套所有"else-if"上方选择的"其他"条款中的语句
是的,这是一种完全有效的方法。但是,除了if
和else
指令外,还可以选择使用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)
)
)