Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
If statement 我应该如何实施;否则,如果;在web组装中?_If Statement_Compiler Construction_Antlr_Webassembly - Fatal编程技术网

If statement 我应该如何实施;否则,如果;在web组装中?

If statement 我应该如何实施;否则,如果;在web组装中?,if-statement,compiler-construction,antlr,webassembly,If Statement,Compiler Construction,Antlr,Webassembly,我正在构建一个利用ANTLR解析我创建的自定义语言语法的项目,我的任务是将这些代码编译/转换为Web汇编 这是一段示例代码,我可以尝试使用该程序进行转换: if (<condition>) { <some code> } else if (<condition>) { <some code> } else { <some code> } if(){ } 如果(){ } 否则{ } 我没有经验的网页组装在一点点

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

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

if (<condition>) {
    <some code>
}
else if (<condition>) {
    <some code>
}
else {
    <some code>
}
if(){
}
如果(){
}
否则{
}
我没有经验的网页组装在一点点,但这是一个项目的要求。“如果”和“其他”的说法似乎相当直截了当,我唯一的问题是“其他如果”的说法

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

任何可以提出的建议都是非常好的,干杯

我认为实现它的唯一方法是将所有的“elseif”语句嵌套在它上面选择的“else”子句中

是的,你就是这样做的

PS:您可能有兴趣知道,许多语言实际上没有专用的else if语法。例如,在C及其许多后代中,if语句的语法如下:

statement: 'if' '(' expression ')' statement ('else' statement)?
因此,
else-if
就是后面跟着if语句的
else
。因此,即使在许多语言的语法层面上,
else-if
也只是else分支中的if语句

因为您的语法看起来很相似,所以也可以用这种方式编写语法,这样您就不需要做任何事情来支持
else if
s

我能想到的实现它的唯一方法是嵌套所有“else if” 上面选择的“else”子句中的语句

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

为了了解其他语言是如何解决这个问题的,我建议大家尝试一下

例如,以下ActionScript代码:

导出函数if\u else\u测试(输入:i32):i32{
如果(输入>10){
返回101;
}否则如果(输入>20){
返回102;
}否则{
返回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)
      )
    )