Shunting-yard algorithm用于将表达式从中缀转换为后缀表示法(反向波兰表示法),因此编译器对它们进行评估是更准确的。例如,2 + 3 * 2
将转换为2 3 2 * +
。在Wikipedia中,提到该算法被许多应用程序使用,包括
任何面向堆栈的编程语言,例如: 向前, 因子, PostScript页面描述语言, Befunge, 喜悦
我没有看到C#甚至任何流行的高级语言。那么,C#是否将此算法用于表达式?如果不是,C#编译器如何编译和计算表达式?
答案 0 :(得分:4)
是的,C#被转换为面向堆栈的编程语言 - IL。当编译器将表达式转换为内部语言时,它会生成一个遵循RPN的操作列表。
例如,这个方法
int x(int a, int b, int c, int d) {
return a+b*(c+d);
}
转换为这种内部语言(请参阅注释以了解正在发生的事情):
IL_0001: ldarg.0 // Push a on the stack
IL_0002: ldarg.1 // Push b on the stack
IL_0003: ldarg.2 // Push c on the stack
IL_0004: ldarg.3 // Push d on the stack
IL_0005: add // Add d+c, push the result
IL_0006: mul // Multiply (d+c) by b
IL_0007: add // Add b*(d+c)+a
正如您所看到的,操作数按顺序被推入堆栈,这样可以方便地从表达式的后面到其前面进行操作 - 正如文章解释的那样。
转换的确切算法依赖于编译器(严格来说,最终结果也是编译器相关的,因为有多种方法可以将表达式转换为有效的RPN序列)但RPN的基本思想是