操作符優先順序定義
檔案:OperatorBase.js
// JScript source code<br />var $OperatorPriority = {<br /> // Logic<br /> "||": 0,<br /> "&&": 0,<br /> // Compare<br /> ">": 1,<br /> ">=": 1,<br /> "<": 1,<br /> "<=": 1,<br /> // Logic compute<br /> "|": 2,<br /> "&": 2,<br /> "^": 2,<br /> // Mathematic<br /> "+": 3,<br /> "-": 3,<br /> "*": 4,<br /> "/": 4,<br /> "%": 4,<br /> // Func<br /> "function": 5,<br /> "unary": 6<br />};
操作符類型定義
檔案:OperatorBase.js
/*****************************<br /> Operator Type<br />*****************************/<br />function UnknownType(sign, argsNum) {<br /> this.DeriveFrom(new Object());<br /> this.set_ClassName("UnknownType");<br /> this._sign = sign;<br /> this._requiredArgsNum = argsNum;<br />};</p><p>UnknownType.prototype = {<br /> get_RequiredArgumentsNum: function() { return this._requiredArgsNum; },<br /> get_Sign: function() { return this._sign; }<br />};</p><p>function UnaryType(sign) {<br /> this.DeriveFrom(new UnknownType(sign, 1));<br /> this.set_ClassName("UnaryType");<br />};</p><p>function BinaryType(sign) {<br /> this.DeriveFrom(new UnknownType(sign, 2));<br /> this.set_ClassName("BinaryType");<br />};</p><p>function ParenthesesType(sign) {<br /> this.DeriveFrom(new UnknownType(sign, 1));<br /> this.set_ClassName("ParentthesesType");<br />};</p><p>function FunctionType(name) {<br /> this.DeriveFrom(new UnknownType(name, -1));<br /> this.set_ClassName("FunctionType");<br />};
OperatorBase 操作符基底類型定義
檔案:OperatorBase.js
// ----------- OperatorBase --------------<br />function OperatorBase() {<br /> this.set_ClassName("OperatorBase");<br /> this._type = new UnknownType("undefined", -1);<br />};</p><p>OperatorBase.prototype = {<br /> // Properties<br /> get_Type: function() { return this._type; },<br /> get_Sign: function() { return this._type.get_Sign(); },<br /> set_Sign: function(sign) { this._type._sign = sign; },<br /> get_RequiredArgumentsNum: function() { return this._type.get_RequiredArgumentsNum(); },<br /> get_Priority: function() {<br /> if (!(this.IsFunction() || this.IsUnary()))<br /> return $OperatorPriority[this.get_Sign()];<br /> else {<br /> if (this.IsFunction())<br /> return $OperatorPriority["function"];<br /> else<br /> return $OperatorPriority["unary"];<br /> }<br /> },<br /> IsPreceding: function(anotherOperator) {<br /> if (this.IsUnary()) {<br /> if (anotherOperator.IsUnary())<br /> return false;<br /> else<br /> return true;<br /> }<br /> else {<br /> if (anotherOperator.IsUnary())<br /> return false;<br /> else<br /> return this.get_Priority() > anotherOperator.get_Priority();<br /> }<br /> }, // IsPreceding<br /> IsUnary: function() { return $T(this._type) == "UnaryType"; },<br /> IsBinary: function() { return $T(this._type) == "BinaryType"; },<br /> IsFunction: function() { return $T(this._type) == "FunctionType"; },<br /> IsParentheses: function() { return $T(this._type) == "ParenthesesType"; },<br /> Evaluate: function(operandArray) {<br /> throw new Exception(this, "Evaluate", "Not implemented");<br /> } // Evaluate<br />};