用 C# 设计与实现一个算术运算解释器 2
2009-05-28 08:28:55 来源:WEB开发网注意 Op 类的成员排列是有讲究的。
_face => 2 字节
_arity => 2 字节
_name => 4 字节
_prioirty => 4 字节
若是颠倒 _arity 和 _name 的顺序,就会导致一个 Op 对象会在托管堆上占据多 4 字节的内存空间。你能回答为什么吗?
定义了一个数组,来存储所有的操作符:
private static readonly Op[][] OpTable = {
new Op[] {
new Op(OpName.PositiveSign, '+', OpArity.Unary),
new Op(OpName.NegativeSign, '-', OpArity.Unary),
},
new Op[] {
new Op(OpName.Exponential, '^', OpArity.Binary),
new Op(OpName.Multiplication, '*', OpArity.Binary),
new Op(OpName.Division, '/', OpArity.Binary),
new Op(OpName.Modulus, '%', OpArity.Binary),
new Op(OpName.Addition, '+', OpArity.Binary),
new Op(OpName.Subtraction, '-', OpArity.Binary),
/* new Op1(OpName.Assignment, '=', OpArity.Binary), */
}
};
把一元运算符和二元运算符分开成两个数组,是为了方便查询。可能你会注意到,这个版本中,暂时还不支持赋值运算符 =;下个版本会支持。:)
二、截取单元指令 (Tokenize)
在这个部分,要考虑到识别一元运算符。怎么识别?
更多精彩
赞助商链接