基於JavaScript的公式解譯器 – 4 【操作符基底類型的實現】

來源:互聯網
上載者:User

操作符優先順序定義

檔案: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 />};

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.