/** Ċ Ġ* Ġ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 . parser . scan on demand . choice Equal Ċ Ċ import Ġnet . ake hur st . language . ag l . runtime . structure . Runtime Rule Choice Kind Ċ import Ġnet . ake hur st . language . ag l . runtime . structure . runtime Rule Set Ċ import Ġnet . ake hur st . language . api . parser . Parse FailedException Ċ import Ġnet . ake hur st . language . parser . scan on demand . test _ Scan On Demand Parser Abstract Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ Ċ internal Ġclass Ġtest _ if Then Else _ Simple Ġ: Ġtest _ Scan On Demand Parser Abstract () Ġ{ ĊĊĠĠĠ Ġ// ĠS Ġ= Ġ Ġexpr Ġ; ĊĠĠĠ Ġ// Ġif then else Ġ= Ġ' if ' Ġexpr Ġ' then ' Ġexpr Ġ' else ' Ġexpr Ġ; ĊĠĠĠ Ġ// Ġif then Ġ= Ġ' if ' Ġexpr Ġ' then ' Ġexpr Ġ; ĊĠĠĠ Ġ// Ġexpr Ġ= Ġvar Ġ< Ġconditional Ġ; ĊĠĠĠ Ġ// Ġconditional Ġ= Ġif then else Ġ| Ġif then ; ĊĠĠĠ Ġ// Ġvar Ġ= ĠW Ġ| ĠX Ġ| ĠY Ġ| ĠZ Ġ; ĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr rs Ġ= Ġruntime Rule Set Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconcat enation (" S ") Ġ{ Ġref (" expr ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchoice (" expr ", ĠRuntime Rule Choice Kind . PRIORITY _ LON GEST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref (" var ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref (" conditional ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchoice (" conditional ", ĠRuntime Rule Choice Kind . LON GEST _ PRIORITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref (" if then else ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref (" if then ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconcat enation (" if then ") Ġ{ Ġliteral (" if "); Ġref (" expr "); Ġliteral (" then "); Ġref (" expr ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconcat enation (" if then else ") Ġ{ Ġliteral (" if "); Ġref (" expr "); Ġliteral (" then "); Ġref (" expr "); Ġliteral (" else "); Ġref (" expr ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchoice (" var ", ĠRuntime Rule Choice Kind . LON GEST _ PRIORITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral (" W ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral (" X ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral (" Y ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral (" Z ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġempty _ fails () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgoal Ġ= Ġ" S " ĊĠĠĠĠĠĠĠ Ġval Ġsentence Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġval Ġex Ġ= Ġassert Fails With ( Parse FailedException :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . test ( rr s , Ġgoal , Ġsentence , 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġex . location . line ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġex . location . column ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġif then else () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgoal Ġ= Ġ" S " ĊĠĠĠĠĠĠĠ Ġval Ġsentence Ġ= Ġ" if W then X else Y " ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr | 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconditional Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif then else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' if ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar Ġ{ Ġ' W ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' then ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar | 1 Ġ{ Ġ' X ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' else ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar | 2 Ġ{ Ġ' Y ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġ// NOTE : Ġseason Ġ 3 5 , Ġlong Ġexpression Ġis Ġdropped Ġin Ġfavour Ġof Ġthe Ġshorter Ġone ! ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsuper . test ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr rs Ġ= Ġr rs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoal Ġ= Ġgoal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsentence Ġ= Ġsentence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Num G SS Head s Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Trees Ġ= Ġ* array Of ( expected ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġif then () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgoal Ġ= Ġ" S " ĊĠĠĠĠĠĠĠ Ġval Ġsentence Ġ= Ġ" if W then X " ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr | 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconditional | 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' if ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar Ġ{ Ġ' W ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' then ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar | 1 Ġ{ Ġ' X ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsuper . test ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr rs Ġ= Ġr rs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoal Ġ= Ġgoal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsentence Ġ= Ġsentence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Num G SS Head s Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Trees Ġ= Ġ* array Of ( expected ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġif then elseif then () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgoal Ġ= Ġ" S " ĊĠĠĠĠĠĠĠ Ġval Ġsentence Ġ= Ġ" if W then X elseif Y then Z " ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr | 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconditional Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif then else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' if ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar Ġ{ Ġ' W ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' then ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar | 1 Ġ{ Ġ' X ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' else ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr | 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconditional | 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' if ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar | 2 Ġ{ Ġ' Y '} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' then ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar | 3 Ġ{ Ġ' Z ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsuper . test ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr rs Ġ= Ġr rs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoal Ġ= Ġgoal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsentence Ġ= Ġsentence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Num G SS Head s Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Trees Ġ= Ġ* array Of ( expected ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġif then if then else () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgoal Ġ= Ġ" S " ĊĠĠĠĠĠĠĠ Ġval Ġsentence Ġ= Ġ" if W then if X then Y else Z " ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr | 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconditional | 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' if ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar Ġ{ Ġ' W ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' then ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr | 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconditional Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif then else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' if ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar | 1 Ġ{ Ġ' X ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' then ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar | 2 Ġ{ Ġ' Y ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' else ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr Ġ{ Ġvar | 3 Ġ{ Ġ' Z ' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsuper . test ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr rs Ġ= Ġr rs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoal Ġ= Ġgoal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsentence Ġ= Ġsentence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Num G SS Head s Ġ= Ġ 2 , Ġ// TODO : Ġcan Ġwe Ġmake Ġthis Ġ 1 Ġby Ġmerging Ġstates ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Trees Ġ= Ġ* array Of ( expected ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ