/** Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠDr . ĠDavid ĠH . ĠA keh ur st Ġ( http :// dr . david . h . ake hur st . net ) Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġnet . ake hur st . language . ag l . runtime . graph Ċ Ċ import Ġnet . ake hur st . language . ag l . parser . Input FromString Ċ import Ġnet . ake hur st . language . ag l . runtime . structure . Rule Option Ċ import Ġnet . ake hur st . language . ag l . runtime . structure . Rule Option Id Ċ import Ġnet . ake hur st . language . ag l . runtime . structure . Rule Position Ċ import Ġnet . ake hur st . language . ag l . runtime . structure . runtime Rule Set Ċ import Ġnet . ake hur st . language . ag l . sp pt . SP PT Branch From Input And G rown Children Ċ import Ġnet . ake hur st . language . ag l . sp pt . SP PT Leaf From Input Ċ import Ġnet . ake hur st . language . api . processor . Automaton Kind Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNot Equals Ċ import Ġkotlin . test . assertNotNull Ċ Ċ class Ġtest _ Grow ing Children Ġ{ ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr rs Ġ= Ġruntime Rule Set Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern (" CM ", Ġ"/ [* ]. * [* ] /", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern (" WS ", Ġ"\\ + s ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconcat enation (" S ") Ġ{ Ġliteral (" a ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠS Ġ= Ġr rs . find Runtime Rule (" S ") ĊĠĠĠĠĠĠĠ Ġval ĠWS Ġ= Ġr rs . find Runtime Rule (" WS ") ĊĠĠĠĠĠĠĠ Ġval ĠCM Ġ= Ġr rs . find Runtime Rule (" CM ") ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġr rs . find Runtime Rule ("' a '") ĊĊĠĠĠĠĠĠĠ Ġval ĠSM Ġ= Ġr rs . fetch State Set For ( S , ĠAutom aton Kind . LOOK A HEAD _ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġs 0 Ġ= ĠSM . start State ĊĠĠĠĠĠĠĠ Ġval ĠG Ġ= Ġs 0 . runtime Rules . first () ĊĠĠĠĠĠĠĠ Ġval Ġst _ a Ġ= ĠSM . states [ listOf ( Rule Position ( a , Ġ 0 , ĠRule Position . END _ OF _ RULE ))] ĊĠĠĠĠĠĠĠ Ġval Ġst _ S _ E OR Ġ= ĠSM . states [ listOf ( Rule Position ( S , Ġ 0 , ĠRule Position . END _ OF _ RULE ))] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠisEmpty _ true () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠ ĠassertEquals ( true , Ġsut . isEmpty ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" {}", Ġsut . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠisEmpty _ false () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠ Ġsut . append Skip If NotEmpty ( listOf ( ws )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( false , Ġsut . isEmpty ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 1 , null [ null ]) Ġ-> ĠWS ", Ġsut . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhas Skip At Start _ false () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , Ġa , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠ Ġsut . appendChild ( st _ a , ĠlistOf ( leaf )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( false , Ġsut . has Skip At Start ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 1 ,' a '[ 0 ]) Ġ-> Ġ' a '", Ġsut . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhas Skip At Start _ true () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠ Ġsut . append Skip If NotEmpty ( listOf ( leaf )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( true , Ġsut . has Skip At Start ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 1 , null [ null ]) Ġ-> ĠWS ", Ġsut . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlast Initial Skip Child _ isNull When Empty () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . last Initial Skip Child ĊĠĠĠĠĠĠĠ Ġval Ġexpected : ĠGrow ing Child Node ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" {}", Ġsut . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlast Initial Skip Child _ when 1 Initial Skip () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , Ġa , Ġ 1 , Ġ 2 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠ Ġsut . append Skip If NotEmpty ( listOf ( ws )) ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġsut . appendChild ( st _ a , ĠlistOf ( leaf )) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . last Initial Skip Child ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġsut . firstChild ( null ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 2 ,' a '[ 0 ]) Ġ-> ĠWS , Ġ' a '", Ġres . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlast Initial Skip Child _ when 2 Initial Skip () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġcm Ġ= ĠSP PT Leaf From Input ( input , ĠCM , Ġ 1 , Ġ 5 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , Ġa , Ġ 5 , Ġ 6 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Skip If NotEmpty ( listOf ( ws )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Skip If NotEmpty ( listOf ( cm )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. appendChild ( st _ a , ĠlistOf ( leaf )) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut ?. last Initial Skip Child ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġsut ?. firstChild ( null )?. next Child ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 6 ,' a '[ 0 ]) Ġ-> ĠWS , ĠCM , Ġ' a '", Ġsut . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlast Initial Skip Child _ when 3 Initial Skip () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġws 1 Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġcm Ġ= ĠSP PT Leaf From Input ( input , ĠCM , Ġ 1 , Ġ 5 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġws 2 Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 5 , Ġ 6 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , Ġa , Ġ 6 , Ġ 7 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Skip If NotEmpty ( listOf ( ws 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Skip If NotEmpty ( listOf ( cm )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Skip If NotEmpty ( listOf ( ws 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. appendChild ( st _ a , ĠlistOf ( leaf )) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut ?. last Initial Skip Child ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġsut ?. firstChild ( null )?. next Child !!. next Child ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 7 ,' a '[ 0 ]) Ġ-> ĠWS , ĠCM , ĠWS , Ġ' a '", Ġsut . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfirst Non Skip Child _ isNull When Empty () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . first Non Skip Child ( Rule Option Id ( S , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġexpected : ĠGrow ing Child Node ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" {}", Ġsut . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfirst Non Skip Child _ when 1 Initial Skip () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , Ġa , Ġ 1 , Ġ 2 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠ Ġsut . append Skip If NotEmpty ( listOf ( ws )) ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġsut . appendChild ( st _ a , ĠlistOf ( leaf )) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . first Non Skip Child ( Rule Option Id ( S , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġsut . firstChild ( null )?. next Child ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 2 ,' a '[ 0 ]) Ġ-> ĠWS , Ġ' a '", Ġres . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfirst Non Skip Child _ when 2 Initial Skip () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġcm Ġ= ĠSP PT Leaf From Input ( input , ĠCM , Ġ 1 , Ġ 5 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , Ġa , Ġ 5 , Ġ 6 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Skip If NotEmpty ( listOf ( ws )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Skip If NotEmpty ( listOf ( cm )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. appendChild ( st _ a , ĠlistOf ( leaf )) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut ?. first Non Skip Child ( Rule Option Id ( S , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġsut ?. firstChild ( null )?. next Child !!. next Child ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 6 ,' a '[ 0 ]) Ġ-> ĠWS , ĠCM , Ġ' a '", Ġsut . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfirst Non Skip Child _ when 3 Initial Skip () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġws 1 Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġcm Ġ= ĠSP PT Leaf From Input ( input , ĠCM , Ġ 1 , Ġ 5 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġws 2 Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 5 , Ġ 6 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , Ġa , Ġ 6 , Ġ 7 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Skip If NotEmpty ( listOf ( ws 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Skip If NotEmpty ( listOf ( cm )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Skip If NotEmpty ( listOf ( ws 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. appendChild ( st _ a , ĠlistOf ( leaf )) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut ?. first Non Skip Child ( Rule Option Id ( S , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġsut ?. firstChild ( null )?. next Child !!. next Child !!. next Child ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 7 ,' a '[ 0 ]) Ġ-> ĠWS , ĠCM , ĠWS , Ġ' a '", Ġsut . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġappend Skip If NotEmpty _ at Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġws 1 Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . append Skip If NotEmpty ( listOf ( ws 1 )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( sut , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual . length ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġactual . number Non Skip ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual . next Input Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġactual . start Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( ws 1 ), Ġactual . firstChild ( null )?. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 1 , null [ null ]) Ġ-> ĠWS ", Ġactual . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġappend Skip If NotEmpty _ at End () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , Ġa , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġws 1 Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 1 , Ġ 2 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠGrow ing Children () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. appendChild ( st _ a , ĠlistOf ( leaf )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . append Skip If NotEmpty ( listOf ( ws 1 )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactual ?. length ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual ?. number Non Skip ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactual ?. next Input Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġactual ?. start Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( leaf ), Ġactual ?. firstChild ( Rule Option ( a , Ġ 0 )) ?. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( ws 1 ), Ġactual ?. firstChild ( Rule Option ( a , Ġ 0 )) ?. next Child !!. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 2 ,' a '[ 0 ]) Ġ-> Ġ' a ', ĠWS ", Ġactual . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġconcatenate 1 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġws 1 Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , Ġa , Ġ 1 , Ġ 2 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut 1 Ġ= ĠGrow ing Children (). append Skip If NotEmpty ( listOf ( ws 1 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut 2 Ġ= ĠGrow ing Children (). appendChild ( st _ a , ĠlistOf ( leaf )) ĊĊĠĠĠĠĠĠĠ Ġsut 1 . concatenate ( sut 2 !! ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġsut 1 . length ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġsut 1 . number Non Skip ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġsut 1 . next Input Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġsut 1 . start Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( ws 1 ), Ġsut 1 . firstChild ( null )?. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( leaf ), Ġsut 1 . firstChild ( null )?. next Child !!. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 2 ,' a '[ 0 ]) Ġ-> ĠWS , Ġ' a '", Ġsut 1 . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġconcatenate 2 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , Ġa , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġws 1 Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 1 , Ġ 2 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsut 1 Ġ= ĠGrow ing Children (). appendChild ( st _ a , ĠlistOf ( leaf )) ĊĠĠĠĠĠĠĠ Ġval Ġsut 2 Ġ= ĠGrow ing Children (). append Skip If NotEmpty ( listOf ( ws 1 )) ĊĠĠĠĠĠĠĠ Ġsut 1 ?. concatenate ( sut 2 ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġsut 1 ?. length ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġsut 1 ?. number Non Skip ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġsut 1 ?. next Input Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġsut 1 ?. start Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( leaf ), Ġsut 1 ?. firstChild ( null )?. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( ws 1 ), Ġsut 1 ?. firstChild ( null )?. next Child !!. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 2 ,' a '[ 0 ]) Ġ-> Ġ' a ', ĠWS ", Ġsut 1 . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġappend Child _ at Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġleaf Ġ= ĠSP PT Leaf From Input ( input , Ġa , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . appendChild ( st _ a , ĠlistOf ( leaf )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( sut , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual ?. length ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual ?. number Non Skip ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual ?. next Input Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġactual ?. start Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( leaf ), Ġactual ?. firstChild ( Rule Option ( a , Ġ 0 )) ?. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 1 ,' a '[ 0 ]) Ġ-> Ġ' a '", Ġactual . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġappend Child _ goal At Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġgoal Ġ= ĠSP PT Branch From Input And G rown Children ( input , ĠG , Ġ 0 , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . appendChild ( s 0 , ĠlistOf ( goal )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( sut , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual ?. length ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual ?. number Non Skip ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual ?. next Input Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġactual ?. start Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( goal ), Ġactual ?. firstChild ( Rule Option ( G , Ġ 0 )) ?. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 1 ,< GO AL >[ 0 ]) Ġ-> Ġ< GO AL >", Ġactual . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġappend Child _ second Goal At Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġgoal 1 Ġ= ĠSP PT Branch From Input And G rown Children ( input , ĠG , Ġ 0 , Ġ 0 , Ġ 2 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġgoal 2 Ġ= ĠSP PT Branch From Input And G rown Children ( input , ĠG , Ġ 0 , Ġ 0 , Ġ 3 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĊĠĠĠĠĠĠĠ Ġsut . appendChild ( s 0 , ĠlistOf ( goal 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . appendChild ( s 0 , ĠlistOf ( goal 2 )) !! ĊĊĠĠĠĠĠĠĠ Ġassert Not Equals ( sut , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual . length ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual . number Non Skip ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġactual . next Input Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġactual . start Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( null , Ġactual . firstChild ( Rule Option ( G , Ġ 0 )) ?. next Child ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( actual . firstChild ( Rule Option ( G , Ġ 0 ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( goal 1 ), Ġactual . firstChild ( Rule Option ( G , Ġ 0 )) ?. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( goal 2 ), Ġactual . firstChild ( Rule Option ( G , Ġ 0 )) ?. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 3 ,< GO AL >[ 0 ]) Ġ-> Ġ< GO AL >", Ġactual . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġappend Child _ goal After Skip () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġws 1 Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġgoal Ġ= ĠSP PT Branch From Input And G rown Children ( input , ĠG , Ġ 0 , Ġ 1 , Ġ 2 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĊĠĠĠĠĠĠĠ Ġsut . append Skip If NotEmpty ( listOf ( ws 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . appendChild ( s 0 , ĠlistOf ( goal )) !! ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( sut , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactual . length ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual . number Non Skip ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactual . next Input Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġactual . start Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( ws 1 ), Ġactual . firstChild ( null )?. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( goal ), Ġactual . firstChild ( null )?. next Child !!. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 2 ,< GO AL >[ 0 ]) Ġ-> ĠWS , Ġ< GO AL >", Ġactual . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġappend Child _ second Goal After Skip () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠInput FromString ( rr s . terminal Rules . size , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġws 1 Ġ= ĠSP PT Leaf From Input ( input , ĠWS , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġgoal 1 Ġ= ĠSP PT Branch From Input And G rown Children ( input , ĠG , Ġ 0 , Ġ 1 , Ġ 2 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġgoal 2 Ġ= ĠSP PT Branch From Input And G rown Children ( input , ĠG , Ġ 0 , Ġ 1 , Ġ 3 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠGrow ing Children () ĊĊĠĠĠĠĠĠĠ Ġsut . append Skip If NotEmpty ( listOf ( ws 1 )) ĊĠĠĠĠĠĠĠ Ġsut . appendChild ( s 0 , ĠlistOf ( goal 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . appendChild ( s 0 , ĠlistOf ( goal 2 )) !! ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( sut , Ġactual ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactual . length ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual . number Non Skip ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġactual . next Input Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġactual . start Position ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( ws 1 ), Ġactual . firstChild ( null )?. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( null , Ġactual . firstChild ( null )?. next Child ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( actual . firstChild ( null )?. next Child Altern atives ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual . firstChild ( null )?. next Child Altern atives !!. size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactual . firstChild ( null )?. next Child Altern atives ! ![ listOf ( Rule Option ( G , Ġ 0 ))] !!. size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( goal 1 ), Ġactual . firstChild ( null )?. next Child Altern atives ! ![ listOf ( Rule Option ( G , Ġ 0 ))] ! ![ 0 ]. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( goal 2 ), Ġactual . firstChild ( null )?. next Child Altern atives ! ![ listOf ( Rule Option ( G , Ġ 0 ))] ! ![ 1 ]. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( goal 2 ), Ġactual . last Child ?. children ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("( 0 , 3 ,< GO AL >[ 0 ]) Ġ-> ĠWS , Ġ< GO AL >", Ġactual . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget _ when Empty () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget _ when Skip At Start () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget _ when 1 Non Skip Start () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget _ when 3 Non Skip Start () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget _ when 1 Non Skip After Skip () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget _ when 3 Non Skip After Skip () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget _ when 3 Alt Non Skip Start () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget _ when 3 Alt Non Skip After Skip () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget _ when 3 Non Skip Start And 2 Has 3 Al ts () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget _ when 3 Non Skip Start And 3 Has 3 Al ts () Ġ{ ĊĠĠĠ Ġ} Ċ }