import Ġjava . util .* Ċ Ċ internal Ġclass ĠCalc Sh unting Y ard Algorithm ( functions : ĠCalc Function Set ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ number Parser Ġ= ĠCalc Number Parser () ĊĠĠĠ Ġprivate Ġval Ġ_ string Parser Ġ= ĠCalc String Parser () ĊĠĠĠ Ġprivate Ġval Ġ_ functions Ġ= Ġfunctions Ġ?: ĠCalc Function Set . default () ĊĊĠĠĠ Ġinternal Ġfun Ġparse Tokens ( context : ĠCalc Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens : ĠArrayList < Calc Token >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrings : ĠHashSet < String >) Ġ: ĠCalc Error Info ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġoperator Stack Ġ= ĠArray Deque < Calc Token >() ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġcontext . text ĊĊĠĠĠĠĠĠĠ Ġvar Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Unary ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( context . offset Ġ< Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacter Ġ= Ġtext [ context . offset ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Calc Char Helper . isEmpty Object ( character )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . offset ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Offset Ġ= Ġcontext . offset ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Calc Char Helper . isNumber Char ( character ) Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= Ġ_ number Parser . parse Number ( context ) Ġ?: Ġreturn Ġerror ( Calc ErrorCode . Invalid Number , Ġtoken Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( Calc Token ( Calc TokenType . Constant , Ġtoken Offset , Ġnumber Ġ= Ġnumber Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Binary ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character Ġ== ĠCalc Char Helper . String Char ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . offset ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Ġ= Ġ_ string Parser . parse String ( context ) Ġ?: Ġreturn Ġerror ( Calc ErrorCode . Invalid String , Ġtoken Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrings . add ( string ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( Calc Token ( Calc TokenType . String , Ġtoken Offset , Ġtext Ġ= Ġstring )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Binary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character Ġ== ĠCalc Char Helper . Variable Char ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . offset ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Name Builder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( context . offset Ġ< Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġletter Char Ġ= ĠCalc Char Helper . is Letter Char ( text [ context . offset ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠCalc Char Helper . isNumber Char ( text [ context . offset ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable Name Builder . append ( letter Char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . offset ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variable Name Builder . isEmpty ()) Ġreturn Ġerror ( Calc ErrorCode . Invalid Variable , Ġtoken Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Name Ġ= Ġvariable Name Builder . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( Calc Token ( Calc TokenType . Variable , Ġtoken Offset , Ġtext Ġ= Ġvariable Name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Binary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character Ġ== ĠCalc Char Helper . Comma Char ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context Ar ity Ġ== ĠCalc Context Ar ity . Unary ) Ġreturn Ġerror ( Calc ErrorCode . In consistent Comma , Ġtoken Offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġleft Bracket Is Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! operator Stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Token Ġ= Ġoperator Stack . remove First () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Token . type Ġ== ĠCalc TokenType . Left Bracket ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Bracket Is Found Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Stack . add First ( prev Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( prev Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! left Bracket Is Found ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġerror ( Calc ErrorCode . In consistent Comma , Ġtoken Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Stack . add First ( Calc Token ( Calc TokenType . Comma , Ġtoken Offset )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Unary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . offset ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Bracket Ġ= ĠCalc Char Helper . check Left Bracket ( character ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Bracket Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . offset ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Lift Return Or Assignment ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skip Empty Br ackets ( context , Ġleft Bracket )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Stack . add First ( Calc Token ( Calc TokenType . Empty , Ġtoken Offset )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Binary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Stack . add First ( Calc Token ( Calc TokenType . Left Bracket , Ġtoken Offset , Ġbracket Ġ= Ġleft Bracket )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Unary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Bracket Ġ= ĠCalc Char Helper . check Right Bracket ( character ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Bracket Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context Ar ity Ġ== ĠCalc Context Ar ity . Unary Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( operator Stack . isEmpty () Ġ|| Ġoperator Stack . peek First (). type Ġ!= ĠCalc TokenType . Left Bracket )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġerror ( Calc ErrorCode . In consistent Bracket , Ġtoken Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġleft Bracket Is Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! operator Stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Token Ġ= Ġoperator Stack . remove First () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Token . type Ġ== ĠCalc TokenType . Left Bracket ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Bracket Ġ!= Ġprev Token . bracket ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġerror ( Calc ErrorCode . In consistent Bracket , Ġtoken Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Bracket Is Found Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( prev Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! left Bracket Is Found ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġerror ( Calc ErrorCode . In consistent Bracket , Ġtoken Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! operator Stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Token Ġ= Ġoperator Stack . peek First () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function Token ?. type Ġ== ĠCalc TokenType . Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Stack . remove First () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( function Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Binary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . offset ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Info Ġ= Ġ_ functions . get Function Search (). find ( context , Ġcontext Ar ity ) Ġ?: Ġreturn Ġerror ( Calc ErrorCode . Invalid Token , Ġtoken Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= Ġfunction Info . function ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Ar ity Ġ= Ġfunction Info . function Ar ity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Type Ġ= Ġif Ġ( function Ar ity Ġ== ĠCalc Function Ar ity . Binary ) ĠCalc TokenType . Binary Operator Ġelse ĠCalc TokenType . Function ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= ĠCalc Token ( token Type , Ġtoken Offset , Ġfunction Ġ= Ġfunction , Ġtext Ġ= Ġfunction Info . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinary Operator Ġ= Ġif Ġ( function Ar ity Ġ!= ĠCalc Function Ar ity . Unary Pre ) Ġfunction . binary Operator Ġelse Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function Ar ity Ġ== ĠCalc Function Ar ity . Binary Ġ&& Ġcontext Ar ity Ġ== ĠCalc Context Ar ity . Unary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġerror ( Calc ErrorCode . Invalid Token , Ġtoken Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function . max Operand Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Empty Br ackets ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Binary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( binary Operator Ġ!= Ġnull Ġ&& Ġ! operator Stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprev Token Ġ= Ġoperator Stack . peek First () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Token . type Ġ== ĠCalc TokenType . Left Bracket Ġ|| Ġprev Token . type Ġ== ĠCalc TokenType . Comma ) Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Operator Ġ= Ġprev Token . function ?. binary Operator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Token . type Ġ== ĠCalc TokenType . Binary Operator Ġ&& Ġprev Operator Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Operator . pre cedence Ġ< Ġbinary Operator . pre cedence Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( prev Operator . pre cedence Ġ== Ġbinary Operator . pre cedence Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Operator . associ ativity Ġ== ĠCalc Associ ativity . Right )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Token Ġ= Ġoperator Stack . remove First () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( prev Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function Ar ity Ġ== ĠCalc Function Ar ity . Unary Post ) Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Empty Br ackets ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Binary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function . min Operand Count Ġ== Ġ 0 Ġ&& Ġ! next Is Left Bracket ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( Calc Token ( Calc TokenType . Empty , Ġtoken Offset )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Binary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Stack . add First ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ar ity Ġ= ĠCalc Context Ar ity . Unary ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! operator Stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġoperator Stack . remove First () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token . type Ġ== ĠCalc TokenType . Left Bracket ) Ġerror ( Calc ErrorCode . In consistent Bracket , Ġtoken . offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( token ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġerror ( errorCode : ĠCalc ErrorCode , Ġoffset : ĠInt ) Ġ: ĠCalc Error Info Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCalc Error Info ( errorCode , Ġoffset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Is Left Bracket ( context : ĠCalc Context ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlocal Offset Ġ= Ġcontext . offset ĊĠĠĠĠĠĠĠ Ġwhile Ġ( local Offset Ġ< Ġcontext . text . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacter Ġ= Ġcontext . text [ local Offset ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Calc Char Helper . isEmpty Object ( character )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Offset ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCalc Char Helper . check Left Bracket ( character ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip Empty Br ackets ( context : ĠCalc Context , Ġcurrent Bracket : ĠCalc Bracket ? Ġ= Ġnull ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlocal Offset Ġ= Ġcontext . offset ĊĠĠĠĠĠĠĠ Ġvar Ġbracket : ĠCalc Bracket ? Ġ= Ġcurrent Bracket ĊĠĠĠĠĠĠĠ Ġwhile Ġ( local Offset Ġ< Ġcontext . text . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacter Ġ= Ġcontext . text [ local Offset ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Calc Char Helper . isEmpty Object ( character )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Offset ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Bracket Ġ= ĠCalc Char Helper . check Left Bracket ( character ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Bracket Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bracket Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbracket Ġ= Ġleft Bracket ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Offset ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Bracket Ġ= ĠCalc Char Helper . check Right Bracket ( character ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Bracket Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( right Bracket Ġ== Ġbracket ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Offset ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . offset Ġ= Ġlocal Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ }