我正在寻找堆栈机器的C#实现,最好是一个带有单元测试或至少几个例子。 http://en.wikipedia.org/wiki/P-code_machine处的代码似乎是我正在寻找的那种东西。不幸的是,自从我在Pascal中编程以来,已经过了十多年,并遇到了一些将其移植到C#的问题。此外,没有使用代码的示例。
无论如何,在这方面的任何帮助将不胜感激....
答案 0 :(得分:3)
解释堆栈计算机在概念上与Reverse Polish notation非常相似。
表达式
3 + (6 - 2)
以RPN表示为
3 6 2 - +
评估如下:
Input Operation Stack Comment 3 Push value 3 6 Push value 6 3 2 Push value 2 6 3 - Subtract 4 Pop two values (6, 2) and push result (4) 3 + Add 7 Pop two values (3, 4) and push result (7)
从那里开始,在C#中构建一个简单的解释堆栈机器应该很容易。 E.g。
var stack = new Stack<int>();
var program = new[]
{
OpCode.Ldc_3,
OpCode.Ldc_6,
OpCode.Ldc_2,
OpCode.Sub,
OpCode.Add,
};
for (int i = 0; i < program.Length; i++)
{
int a, b;
switch (program[i])
{
case OpCode.Add: b = stack.Pop(); a = stack.Pop(); stack.Push(a + b); break;
case OpCode.Sub: b = stack.Pop(); a = stack.Pop(); stack.Push(a - b); break;
case OpCode.Mul: b = stack.Pop(); a = stack.Pop(); stack.Push(a * b); break;
case OpCode.Div: b = stack.Pop(); a = stack.Pop(); stack.Push(a / b); break;
case OpCode.Ldc_0: stack.Push(0); break;
case OpCode.Ldc_1: stack.Push(1); break;
case OpCode.Ldc_2: stack.Push(2); break;
case OpCode.Ldc_3: stack.Push(3); break;
case OpCode.Ldc_4: stack.Push(4); break;
case OpCode.Ldc_5: stack.Push(5); break;
case OpCode.Ldc_6: stack.Push(6); break;
case OpCode.Ldc_7: stack.Push(7); break;
case OpCode.Ldc_8: stack.Push(8); break;
}
}
var result = stack.Pop();
与
enum OpCode
{
Nop, // No operation is performed.
Add, // Adds two values and pushes the result onto the evaluation stack.
Sub, // Subtracts one value from another and pushes the result onto the
// evaluation stack.
Mul, // Multiplies two values and pushes the result on the evaluation
// stack.
Div, // Divides two values and pushes the result onto the evaluation
// stack.
Ldc_0, // Pushes the integer value of 0 onto the evaluation stack.
Ldc_1, // Pushes the integer value of 1 onto the evaluation stack.
Ldc_2, // Pushes the integer value of 2 onto the evaluation stack.
Ldc_3, // Pushes the integer value of 3 onto the evaluation stack.
Ldc_4, // Pushes the integer value of 4 onto the evaluation stack.
Ldc_5, // Pushes the integer value of 5 onto the evaluation stack.
Ldc_6, // Pushes the integer value of 6 onto the evaluation stack.
Ldc_7, // Pushes the integer value of 7 onto the evaluation stack.
Ldc_8, // Pushes the integer value of 8 onto the evaluation stack.
}
对于一个真实世界的示例,请查看.NET Framework中的fields of the OpCodes class。
答案 1 :(得分:2)
原始的Magpie解释器是用C#编写的,并编译成基于堆栈的字节码。查看Machine.cs核心解释器类。将源代码转换为此字节码的编译器位于Magpie.Compiler。