class ĠCalc Function Set Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ function Search Tree Ġ= ĠCalc Function T rie () ĊĊĠĠĠ Ġinternal Ġfun Ġget Function Search () Ġ: ĠCalc Function Search Provider Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ function Search Tree ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġempty (): ĠCalc Function Set Ġ= ĠCalc Function Set () ĊĠĠĠĠĠĠĠ Ġfun Ġdefault (): ĠCalc Function Set Ġ= ĠCalc Default Functions . default Function Set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Parameter less Function ( name : ĠString , Ġfunction Ġ: ĠCalc Function Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunary Alias : ĠString ? Ġ= Ġnull , Ġreturns Ref : ĠBoolean Ġ= Ġfalse ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name . isEmpty ()) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ_ function Search Tree . add ( Calc Function ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalias Ġ= Ġunary Alias , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Operator Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Ġ= Ġfunction , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Function Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Operand Count Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturns Ref Ġ= Ġreturns Ref )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Function ( name : ĠString , Ġfunction : ĠCalc Function Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count : ĠInt , Ġmax Operand Count : ĠInt ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunary Alias : ĠString ? Ġ= Ġnull , Ġreturns Ref : ĠBoolean Ġ= Ġfalse ) Ġ: ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . isEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( min Operand Count Ġ< Ġ 0 ) Ġ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( max Operand Count Ġ!= Ġnull Ġ&& Ġ( min Operand Count Ġ> Ġmax Operand Count )) Ġreturn Ġfalse ĊĊĊĠĠĠĠĠĠĠ Ġ_ function Search Tree . add ( Calc Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias Ġ= Ġunary Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Operator Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Ġ= Ġfunction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Function Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count Ġ= Ġmin Operand Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Operand Count Ġ= Ġmax Operand Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturns Ref Ġ= Ġreturns Ref )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Operator Function ( name : ĠString , Ġfunction : ĠCalc Function Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Name : ĠString ?, Ġassoci ativity : ĠCalc Associ ativity , Ġprecedence : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count : ĠInt , Ġmax Operand Count : ĠInt ?, Ġis Com mut ative : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunary Alias : ĠString ? Ġ= Ġnull , Ġunary Post Alias : ĠString ? Ġ= Ġnull , Ġbinary Alias : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturns Ref : ĠBoolean Ġ= Ġfalse ) Ġ: ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . isEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( min Operand Count Ġ<= Ġ 0 ) Ġ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( max Operand Count Ġ!= Ġnull Ġ&& Ġ( min Operand Count Ġ> Ġmax Operand Count )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ_ function Search Tree . add ( Calc Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias Ġ= Ġunary Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Operator Ġ= ĠCalc Binary Operator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġbinary Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias Ġ= Ġbinary Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunary Post Alias Ġ= Ġunary Post Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassoci ativity Ġ= Ġassoci ativity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprecedence Ġ= Ġprecedence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Comparison Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Com mut ative Ġ= Ġis Com mut ative ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Ġ= Ġfunction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Function Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count Ġ= Ġmin Operand Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Operand Count Ġ= Ġmax Operand Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturns Ref Ġ= Ġreturns Ref )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Comparison Operator Function ( name : ĠString , Ġfunction : ĠCalc Function Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Name : ĠString , Ġassoci ativity : ĠCalc Associ ativity , Ġprecedence : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count : ĠInt , Ġmax Operand Count : ĠInt ?, Ġis Com mut ative : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunary Alias : ĠString ? Ġ= Ġnull , Ġunary Post Alias : ĠString ? Ġ= Ġnull , Ġbinary Alias : ĠString ? Ġ= Ġnull ) Ġ: ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . isEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( min Operand Count Ġ<= Ġ 0 ) Ġ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( max Operand Count Ġ!= Ġnull Ġ&& Ġ( min Operand Count Ġ> Ġmax Operand Count )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ_ function Search Tree . add ( Calc Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias Ġ= Ġunary Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Operator Ġ= ĠCalc Binary Operator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġbinary Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias Ġ= Ġbinary Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunary Post Alias Ġ= Ġunary Post Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassoci ativity Ġ= Ġassoci ativity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprecedence Ġ= Ġprecedence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Comparison Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Com mut ative Ġ= Ġis Com mut ative ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Ġ= Ġfunction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Function Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count Ġ= Ġmin Operand Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Operand Count Ġ= Ġmax Operand Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturns Ref Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Parameter less Sequence Function ( name : ĠString , Ġfunction Ġ: ĠCalc Function Sequence Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunary Alias : ĠString ? Ġ= Ġnull , Ġreturns Ref : ĠBoolean Ġ= Ġfalse ) Ġ: ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . isEmpty ()) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ_ function Search Tree . add ( Calc Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias Ġ= Ġunary Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Operator Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Function Ġ= Ġfunction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Operand Count Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturns Ref Ġ= Ġreturns Ref )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Sequence Function ( name : ĠString , Ġfunction : ĠCalc Function Sequence Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count : ĠInt , Ġmax Operand Count : ĠInt ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunary Alias : ĠString ? Ġ= Ġnull ) Ġ: ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . isEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( min Operand Count Ġ< Ġ 0 ) Ġ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( max Operand Count Ġ!= Ġnull Ġ&& Ġ( min Operand Count Ġ> Ġmax Operand Count )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ_ function Search Tree . add ( Calc Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias Ġ= Ġunary Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Operator Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Function Ġ= Ġfunction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count Ġ= Ġmin Operand Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Operand Count Ġ= Ġmax Operand Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturns Ref Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Sequence Operator Function ( name : ĠString , Ġfunction : ĠCalc Function Sequence Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Name : ĠString ?, Ġassoci ativity : ĠCalc Associ ativity , Ġprecedence : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count : ĠInt , Ġmax Operand Count : ĠInt ?, Ġis Com mut ative : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunary Alias : ĠString ? Ġ= Ġnull , Ġunary Post Alias : ĠString ? Ġ= Ġnull , Ġbinary Alias : ĠString ? Ġ= Ġnull ) Ġ: ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . isEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( min Operand Count Ġ<= Ġ 0 ) Ġ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( max Operand Count Ġ!= Ġnull Ġ&& Ġ( min Operand Count Ġ> Ġmax Operand Count )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ_ function Search Tree . add ( Calc Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias Ġ= Ġunary Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Operator Ġ= ĠCalc Binary Operator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġbinary Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias Ġ= Ġbinary Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunary Post Alias Ġ= Ġunary Post Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassoci ativity Ġ= Ġassoci ativity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprecedence Ġ= Ġprecedence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Comparison Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Com mut ative Ġ= Ġis Com mut ative ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Function Ġ= Ġfunction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Operand Count Ġ= Ġmin Operand Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Operand Count Ġ= Ġmax Operand Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturns Ref Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ }