/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 Ġ- Ġ 2 0 2 1 ĠMark o ĠSal me la Ċ Ġ* Ċ Ġ* Ġhttp :// fu us io . org Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . fu us io . fl x . core . parser Ċ Ċ import Ġorg . fu us io . fl x . core . type . impl . Immutable Array Ċ import Ġorg . fu us io . fl x . core . type . impl . ImmutableList Ċ import Ġorg . fu us io . fl x . core . type . impl . Immutable Map Ċ import Ġorg . fu us io . fl x . core . type . impl . Immutable Set Ċ Ċ class ĠForm Parser ( private Ġval Ġobserver : ĠParser Observer ) Ġ{ ĊĊĠĠĠ Ġfun Ġparse ( context : ĠParsing Context , Ġexpression : ĠString ): ĠList < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparsing Results Ġ= Ġmutable ListOf < Any >() ĊĠĠĠĠĠĠĠ Ġcontext . token Stream Ġ= ĠToken Stream ( expression ) ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( context . can Continue ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( context , Ġparsing Results )?. let Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparsing Results . add ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . onNext ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( context . has Errors ()) Ġparsing Results . clear () ĊĠĠĠĠĠĠĠ Ġreturn Ġparsing Results ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠParsing Context , ĊĠĠĠĠĠĠĠ Ġelements : ĠMutable List < Any >, ĊĠĠĠĠĠĠĠ Ġbegin Token : ĠToken ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġend Token : ĠToken ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠAny ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġvar Ġis Quoted Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( context . can Continue ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġcontext . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠAny ? Ġ= Ġwhen Ġ( token ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSymbol Token Ġ-> Ġtoken . toObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Token Ġ-> Ġtoken . toObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInteger Token Ġ-> Ġtoken . toObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Token Ġ-> Ġtoken . toObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChar Token Ġ-> Ġtoken . toObject () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList Begin Token Ġ-> Ġparse Structure ( context , Ġtoken , ĠList End Token . TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList End Token Ġ-> Ġcreate List ( context , Ġelements ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray Begin Token Ġ-> Ġparse Structure ( context , Ġtoken , ĠArray End Token . TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray End Token Ġ-> Ġcreate Array ( context , Ġelements ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap Begin Token Ġ-> Ġparse Structure ( context , Ġtoken , ĠMap Or Set End Token . TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap Or Set End Token Ġ-> Ġcreate Map Or Set ( context , Ġbegin Token !! , Ġelements ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSet Begin Token Ġ-> Ġparse Structure ( context , Ġtoken , ĠMap Or Set End Token . TOKEN ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBase Integer Token Ġ-> Ġtoken . toObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHex adecimal Token Ġ-> Ġtoken . toObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKeyword Token Ġ-> Ġtoken . toObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRegex Token Ġ-> Ġtoken . toObject () Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠQuote Token Ġ-> Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Quoted Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠComment Token Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWhite Space Token Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠError Token Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( context , ĠParser ErrorCode . FAILED _ TO _ A _ FORM , Ġcontext . token Stream . getToken Begin Position ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParsing Completed Token Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Token Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġwhen ( begin Token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Begin Token . TOKEN Ġ-> ĠParser ErrorCode . FAILED _ TO _ PARSE _ ARRAY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Begin Token . TOKEN Ġ-> ĠParser ErrorCode . FAILED _ TO _ PARSE _ LIST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMap Begin Token . TOKEN Ġ-> ĠParser ErrorCode . FAILED _ TO _ PARSE _ MAP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSet Begin Token . TOKEN Ġ-> ĠParser ErrorCode . FAILED _ TO _ PARSE _ SET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠParser ErrorCode . UNKNOWN _ ERROR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( context , Ġcode , Ġcontext . token Stream . getPosition ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . parsing Completed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Quoted Ġ&& Ġtoken Ġ! is ĠQuote Token ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Quoted Ġ= Ġfalse Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. let Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġcreate Quote ( it ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ== Ġend Token Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . dec Parsing Level () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcontext . is Top Parsing Level () Ġ&& Ġ! is Quoted Ġ-> Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . is Top Parsing Level () Ġ-> Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult ?. let Ġ{ Ġelements . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Structure ( context : ĠParsing Context , Ġbegin Token : ĠToken , Ġend Token : ĠToken ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . inc Parsing Level () ĊĠĠĠĠĠĠĠ Ġreturn Ġparse ( context , Ġmutable ListOf (), Ġbegin Token , Ġend Token ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Array ( context : ĠParsing Context , Ġelements : ĠMutable List < Any >): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( context . token Ġ== ĠArray End Token . TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImmutable Array ( elements ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( context , ĠParser ErrorCode . FAILED _ TO _ PARSE _ ARRAY , Ġcontext . token Stream . getPosition ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate List ( context : ĠParsing Context , Ġelements : ĠMutable List < Any >): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( context . token Ġ== ĠList End Token . TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList ( elements ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( context , ĠParser ErrorCode . FAILED _ TO _ PARSE _ LIST , Ġcontext . token Stream . getPosition ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Map Or Set ( context : ĠParsing Context , Ġbegin Token : ĠToken , Ġelements : ĠMutable List < Any >): ĠAny ? Ġ= ĊĠĠĠĠĠĠĠ Ġwhen ( begin Token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap Begin Token Ġ-> Ġcreate Map ( context , Ġelements ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSet Begin Token Ġ-> Ġcreate Set ( context , Ġelements ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Map ( context : ĠParsing Context , Ġelements : ĠMutable List < Any >): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( context . token Ġ== ĠMap Or Set End Token . TOKEN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġelements . size ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ% Ġ 2 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < Any , ĠAny >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize Ġstep Ġ 2 ) Ġmap [ elements [ i ]] Ġ= Ġelements [ i Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableMap ( map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( context , ĠParser ErrorCode . FAILED _ TO _ PARSE _ MAP , Ġcontext . token Stream . getPosition ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( context , ĠParser ErrorCode . FAILED _ TO _ PARSE _ MAP , Ġcontext . token Stream . getPosition ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Set ( context : ĠParsing Context , Ġelements : ĠMutable List < Any >): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( context . token Ġ== ĠMap Or Set End Token . TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImmutable Set ( elements . toSet ()) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( context , ĠParser ErrorCode . FAILED _ TO _ PARSE _ SET , Ġcontext . token Stream . getPosition ()) ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġprivate Ġfun Ġcreate Quote ( element : ĠAny ): Ġorg . fu us io . fl x . core . type . List Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Any >() Ċ // ĠĠĠĠĠĠĠ Ġlist . add ( Flx . get Symbol ( Macro Spec . QUOTE )) Ċ // ĠĠĠĠĠĠĠ Ġlist . add ( element ) Ċ // ĠĠĠĠĠĠĠ Ġreturn ĠImmutableList ( list ) Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonError ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠParsing Context , ĊĠĠĠĠĠĠĠ ĠerrorCode : ĠParser ErrorCode , ĊĠĠĠĠĠĠĠ Ġvar arg Ġargs : ĠAny ĊĠĠĠ Ġ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠParser Error . create ( errorCode , Ġ* args ) ĊĠĠĠĠĠĠĠ Ġcontext . errors . add ( error ) ĊĠĠĠĠĠĠĠ Ġobserver . onError ( error ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } ĊĊĠ ĊĊ