package Ġarray Ċ Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ Ċ class ĠSyntax Text Ġ: ĠA PL Test () Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsimple Custom Syntax () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: value Ġx ) Ġ{ Ġx Ġ+ Ġ 1 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 2 0 0 + foo Ġ( 1 ) ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 2 1 1 , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġconstants () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: constant Ġx ) Ġ{ Ġ 1 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| foo Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 1 0 , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnon Matched Constants () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Fails With < ParseException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: constant Ġx ) Ġ{ Ġ 1 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| foo Ġxyz ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġvalue Arg () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: value Ġx ) Ġ{ Ġx Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| foo Ġ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 1 0 1 , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdouble Value Arg () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: value Ġx Ġ: value Ġy ) Ġ{ Ġx Ġ+ Ġy Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| foo Ġ( 2 0 0 ) Ġ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 2 1 0 , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġoptional Test 0 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: value Ġa Ġ: optional Ġ(: value Ġb )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġa + b ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| foo Ġ( 1 ) Ġ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 3 , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġoptional Test 1 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: value Ġa Ġ: optional Ġ(: value Ġb )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ 1 0 0 + a ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| foo Ġ( 1 0 ) Ġ, Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Dimension ( dimensions Of Size ( 2 ), Ġresult ) ĊĠĠĠĠĠĠĠ Ġassert Array Content ( array Of ( 1 1 0 , Ġ 2 0 0 ), Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġif Test With Optional Else () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġx if Ġ(: value Ġcond Ġ: function Ġthen Statement Ġ: optional Ġ(: constant Ġx else Ġ: function Ġelse Statement )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġâ į ŀ (( cond Ġâī ¡ Ġ 1 ) Ġâ Į · Ġ( â į ŀ (( is Loc ally Bound Ġ' else Statement ) Ġâ Į · ĠÎ» { Î» { â į ¬ }} ĠÎ» { else Statement }) Ġâ į ¬ ) Ġthen Statement ) Ġcond ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ( x if Ġ( 1 ) Ġ{ Ġ 1 0 Ġ}) Ġ( x if Ġ( 0 ) Ġ{ Ġ 1 0 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Dimension ( dimensions Of Size ( 2 ), Ġresult ) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 1 0 , Ġresult . value At ( 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġsecond Res Ġ= Ġresult . value At ( 1 ) ĊĠĠĠĠĠĠĠ Ġassert Dimension ( dimensions Of Size ( 0 ), Ġsecond Res ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġif Test With Else () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġx if Ġ(: value Ġcond Ġ: function Ġthen Statement Ġ: optional Ġ(: constant Ġx else Ġ: function Ġelse Statement )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġâ į ŀ (( cond Ġâī ¡ Ġ 1 ) Ġâ Į · Ġ( â į ŀ (( is Loc ally Bound Ġ' else Statement ) Ġâ Į · ĠÎ» { Î» { â į ¬ }} ĠÎ» { else Statement }) Ġâ į ¬ ) Ġthen Statement ) Ġcond ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ( x if Ġ( 1 ) Ġ{ Ġ 1 0 Ġ} Ġx else Ġ{ Ġ 2 0 Ġ}) Ġ( x if Ġ( 0 ) Ġ{ Ġ 1 1 Ġ} Ġx else Ġ{ Ġ 2 2 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Dimension ( dimensions Of Size ( 2 ), Ġresult ) ĊĠĠĠĠĠĠĠ Ġassert Array Content ( array Of ( 1 0 , Ġ 2 2 ), Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġif Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġx if Ġ(: value Ġcond Ġ: function Ġthen Statement Ġ: constant Ġx else Ġ: function Ġelse Statement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġâ į ŀ (( cond Ġâī ¡ Ġ 1 ) Ġâ Į · Ġelse Statement Ġthen Statement ) Ġcond ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ( x if Ġ( 1 ) Ġ{ Ġ 1 0 Ġ} Ġx else Ġ{ Ġ 1 1 Ġ}) Ġ( x if Ġ( 0 ) Ġ{ Ġ 1 0 0 Ġ} Ġx else Ġ{ Ġ 1 0 1 Ġ}) ĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Dimension ( dimensions Of Size ( 2 ), Ġresult ) ĊĠĠĠĠĠĠĠ Ġassert Array Content ( array Of ( 1 0 , Ġ 1 0 1 ), Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġx if With Side Effect () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( result , Ġoutput ) Ġ= Ġparse AP L Expression With Output ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġx if Ġ(: value Ġcond Ġ: function Ġthen Statement Ġ: constant Ġx else Ġ: function Ġelse Statement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġâ į ŀ (( cond Ġâī ¡ Ġ 1 ) Ġâ Į · Ġelse Statement Ġthen Statement ) Ġcond ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| x if Ġ( 1 ) Ġ{ Ġio : print Ġ" aa " ĠâĹ Ĭ Ġ 1 0 Ġ} Ġx else Ġ{ Ġio : print Ġ" bb " ĠâĹ Ĭ Ġ 1 1 Ġ} ĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 1 0 , Ġresult ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" aa ", Ġoutput ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnon Binding Defined Function () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: n function Ġa ) Ġ{ Ġâ į ŀ a Ġ 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| { Ġx âĨ Ĳ 1 ĠâĹ Ĭ Ġfoo Ġ{ Ġx Ġ} Ġ} Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 1 , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnon Binding Defined Function With Arg () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: n function Ġa ) Ġ{ Ġâ į ŀ a Ġ 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| { Ġx âĨ Ĳ 1 + â į µ ĠâĹ Ĭ Ġfoo Ġ{ Ġx + â į µ Ġ} Ġ} Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 7 , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbinding Function Ensure Local () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġengine Ġ= ĠEngine () ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠStringBuilder Output () ĊĠĠĠĠĠĠĠ Ġengine . standard Output Ġ= Ġout ĊĠĠĠĠĠĠĠ Ġval Ġsource Location Ġ= ĠString Source Location ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: function Ġa ) Ġ{ Ġ( â į ŀ a Ġ 0 ) Ġ+ Ġ 3 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| x ĠâĨ Ĳ Ġfoo Ġ{ Ġb ĠâĨ Ĳ Ġ 2 0 ĠâĹ Ĭ Ġ 1 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| io : print Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| b ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Fails With < Variable Not Assigned > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . parse And Eval ( source Location , Ġtrue ). collapse () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals (" 4 0 ", Ġout . buf . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbinding Defined Function With Arg () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: function Ġa ) Ġ{ Ġâ į ŀ a Ġ 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| { Ġx âĨ Ĳ 1 + â į µ ĠâĹ Ĭ Ġfoo Ġ{ Ġx + â į µ Ġ} Ġ} Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 6 , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexpr Function () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: expr function Ġa ) Ġ{ Ġ 1 + â į ŀ a Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| foo Ġ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 3 , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġoptional Expr Function () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( result , Ġout ) Ġ= Ġparse AP L Expression With Output ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: value Ġx Ġ: optional Ġ(: expr function Ġa )) Ġ{ Ġx +( â į ŀ a Ġ 0 )+( â į ŀ a Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| foo Ġ( 1 0 ) Ġ( io : print Ġ 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 2 8 , Ġresult ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" 9 9 ", Ġout ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdef syntax Repeat () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax sub Ġbar Ġ(: constant Ġab Ġ: value Ġx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġx Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| def syntax Ġfoo Ġ(: repeat Ġ( y Ġbar )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ+ / y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| foo Ġab Ġ( 1 0 ) Ġab Ġ( 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Simple Number ( 3 2 , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcustom Single Char Symbols () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| declare (: single Char Ġ" a ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| a âĨ Ĳ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| b âĨ Ĳ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| bb âĨ Ĳ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| aaaa Ġbb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġassert Dimension ( dimensions Of Size ( 5 ), Ġresult ) ĊĠĠĠĠĠĠĠ Ġassert Array Content ( array Of ( 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 3 ), Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġunknown Declaration Should Fail () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Fails With < Illegal Declaration > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse AP L Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| declare (: foo Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ' a ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ