代码之家  ›  专栏  ›  技术社区  ›  Zebrafish

如何实现一个简单的堆栈机?

  •  0
  • Zebrafish  · 技术社区  · 6 年前

    (11 * 22 + 33 * 44) / 121
    

    说明如下:

    push 11
    push 22
    mult
    push 33
    push 44
    mult
    add
    push 121
    div
    

    我明白这一点。同样,另一篇文章中的另一个例子是:

    (12 + 45) * 98
    

    有说明:

    push 98
    push 12  
    push 45  
    +    
    *
    

    我也明白。但假设在第一个例子中,我们想要反转除法,如下所示:

     Instead of:
        (11 * 22 + 33 * 44) / 121
    
        have:
        121 / (11 * 22 + 33 * 44)
    

    push 121
    push 11
    push 22
    mult
    push 33
    push 44
    mult
    add
    div
    

    如您所见,在最初的示例中,121是第一个推送的对象,而不是最后一个。但是,因为其他部分在括号中,所以应该首先对其进行评估,您如何解决这个问题?

    我发现的其他例子也有同样的问题。如何正确排序值和操作?你需要向前看吗?或者有没有一种简单的方法来遍历表达式并创建指令?从我读到的内容来看,这似乎是计算表达式的最简单的方法,它们似乎意味着编写指令非常简单,就好像你可以在表达式上运行并为它创建正确的反向波兰符号一样。我很难理解如何以正确的方式排列值和指令。

    1 回复  |  直到 6 年前
        1
  •  1
  •   user2201041 user2201041    6 年前

    正如我们在注释中讨论的,求值顺序与运算符优先级无关。例如,在Java中,子表达式从左到右求值。在C中,求值的顺序是未指定的。相反,它有一个 ,基本上是说“无论你需要做什么,只要确保它发生在分号之前。”

    现在,有一个例子,求值顺序确实很重要。在大多数语言中, && ||

    例如,如果我们有 1 > 2 && 2 < 3

    push 1
    push 2
    >
    jmp_f lbl0  ; jump if false to label lbl0
    push 2
    push 3
    <
    &&
    label lbl0