/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠSyntax Error 4 0 4 Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNON - INFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġat . syntax error . json 5 Ċ Ċ import Ġat . syntax error . json 5 . JSONException . SyntaxError Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . Reader Ċ import Ġkotlinx . serialization . json . Json Element Ċ import Ġkotlinx . serialization . json . Json Null Ċ import Ġkotlinx . serialization . json . Json Primitive Ċ Ċ /** Ċ Ġ* ĠA ĠJSON Parser Ġis Ġused Ġto Ġconvert Ġa Ġsource Ġstring Ġinto Ġtokens , Ġwhich Ġthen Ġare Ġused Ġto Ġconstruct Ċ Ġ* Ġ[ JSON Objects ][ Decode Json 5 Object ] Ġand Ġ[ JSON Arrays ][ Decode Json 5 Array ] Ċ Ġ* Ċ Ġ* ĠThe Ġreader Ġis Ġnot Ġ[ closed ][ Reader . close ] Ċ Ġ* Ċ Ġ* Ġ@ author ĠSyntax Error 4 0 4 Ċ Ġ*/ Ċ class ĠJSON Parser ( ĊĠ Ġreader : ĠReader , ĊĠ Ġprivate Ġval Ġj 5 : ĠJson 5 Module , Ċ ) Ġ{ ĊĊĠ Ġprivate Ġval Ġreader : ĠReader Ġ= Ġif Ġ( reader . mark Supported ()) Ġreader Ġelse ĠBufferedReader ( reader ) ĊĠ Ġ/** Ġwhether Ġthe Ġend Ġof Ġthe Ġfile Ġhas Ġbeen Ġreached Ġ*/ ĊĠ Ġprivate Ġvar Ġeof : ĠBoolean Ġ= Ġfalse ĊĠ Ġ/** Ġwhether Ġthe Ġcurrent Ġcharacter Ġshould Ġbe Ġre - read Ġ*/ ĊĠ Ġprivate Ġvar Ġback : ĠBoolean Ġ= Ġfalse ĊĠ Ġ/** Ġthe Ġabsolute Ġposition Ġin Ġthe Ġstring Ġ*/ ĊĠ Ġprivate Ġvar Ġindex : ĠLong Ġ= Ġ- 1 ĊĠ Ġ/** Ġthe Ġrelative Ġposition Ġin Ġthe Ġline Ġ*/ ĊĠ Ġprivate Ġvar Ġcharacter : ĠLong Ġ= Ġ 0 ĊĠ Ġ/** Ġthe Ġline Ġnumber Ġ*/ ĊĠ Ġprivate Ġvar Ġline : ĠLong Ġ= Ġ 1 ĊĠ Ġ/** Ġthe Ġprevious Ġcharacter Ġ*/ ĊĠ Ġprivate Ġvar Ġprevious : ĠChar Ġ= ĠChar . MIN _ VALUE ĊĠ Ġ/** Ġthe Ġcurrent Ġcharacter Ġ*/ ĊĠ Ġprivate Ġvar Ġcurrent : ĠChar Ġ= ĠChar . MIN _ VALUE ĊĊĠ Ġprivate Ġval Ġnext Clean To Delimit ers : ĠString Ġ= Ġ", ]}" ĊĊĠ Ġprivate Ġfun Ġmore (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( back Ġ|| Ġeof ) Ġ{ ĊĠĠĠĠĠ Ġback Ġ&& Ġ! eof ĊĠĠĠ Ġ} Ġelse Ġpeek (). code Ġ> Ġ 0 ĊĠ Ġ} ĊĊĠ Ġ/** ĠFor ces Ġthe Ġparser Ġto Ġre - read Ġthe Ġlast Ġcharacter Ġ*/ ĊĠ Ġfun Ġback () Ġ{ ĊĠĠĠ Ġback Ġ= Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġpeek (): ĠChar Ġ{ ĊĠĠĠ Ġif Ġ( eof ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠChar . MIN _ VALUE ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġc : ĠInt ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġreader . mark ( 1 ) ĊĠĠĠĠĠ Ġc Ġ= Ġreader . read () ĊĠĠĠĠĠ Ġreader . reset () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" Could Ġnot Ġpeek Ġfrom Ġsource ", Ġe ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġif Ġ( c Ġ== Ġ- 1 ) ĠChar . MIN _ VALUE Ġelse Ġc . to Char () ĊĠ Ġ} ĊĊĠ Ġprivate Ġoperator Ġfun Ġnext (): ĠChar Ġ{ ĊĠĠĠ Ġif Ġ( back ) Ġ{ ĊĠĠĠĠĠ Ġback Ġ= Ġfalse ĊĠĠĠĠĠ Ġreturn Ġcurrent ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġc : ĠInt Ġ= Ġtry Ġ{ ĊĠĠĠĠĠ Ġreader . read () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" Could Ġnot Ġread Ġfrom Ġsource ", Ġe ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( c Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġeof Ġ= Ġtrue ĊĠĠĠĠĠ Ġreturn ĠChar . MIN _ VALUE ĊĠĠĠ Ġ} ĊĠĠĠ Ġprevious Ġ= Ġcurrent ĊĠĠĠ Ġcurrent Ġ= Ġc . to Char () ĊĠĠĠ Ġindex ++ ĊĠĠĠ Ġif Ġ( is Line Termin ator ( current ) Ġ&& Ġ( current Ġ!= Ġ'\ n ' Ġ|| Ġprevious Ġ!= Ġ'\ r ')) Ġ{ ĊĠĠĠĠĠ Ġline ++ ĊĠĠĠĠĠ Ġcharacter Ġ= Ġ 0 ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġcharacter ++ ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcurrent ĊĠ Ġ} ĊĊĠ Ġ// Ġhttps :// 2 6 2 . ec ma - international . org / 5 . 1 /# sec - 7 . 3 ĊĠ Ġprivate Ġfun Ġis Line Termin ator ( c : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( c ) Ġ{ ĊĠĠĠĠĠ Ġ'\ n ', Ġ'\ r ', Ġ'\ u 2 0 2 8 ', Ġ'\ u 2 0 2 9 ' Ġ-> Ġtrue ĊĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// Ġhttps :// spec . json 5 . org /# white - space ĊĠ Ġprivate Ġfun Ġis Whitespace ( c : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( c ) Ġ{ ĊĠĠĠĠĠ Ġ'\ t ', Ġ'\ n ', Ġ'\ u 0 0 0 B ', ĠJson 5 Escape Sequence . Form Feed . char , ĊĠĠĠĠĠ Ġ'\ r ', Ġ' Ġ', Ġ'\ u 0 0 A 0 ', Ġ'\ u 2 0 2 8 ', Ġ'\ u 2 0 2 9 ', Ġ'\ u FE FF ' Ġ-> Ġtrue ĊĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠUnicode Ġcategory Ġ" Zs " Ġ( space Ġsepar ators ) ĊĠĠĠĠĠĠĠ ĠCharacter . getType ( c ) Ġ== ĠCharacter . SPACE _ SEPARATOR . toInt () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġnext Multi Line Comment () Ġ{ ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġval Ġn Ġ= Ġnext () ĊĠĠĠĠĠ Ġif Ġ( n Ġ== Ġ'*' Ġ&& Ġpeek () Ġ== Ġ'/') Ġ{ ĊĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġnext Single Line Comment () Ġ{ ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġval Ġn Ġ= Ġnext () ĊĠĠĠĠĠ Ġif Ġ( is Line Termin ator ( n ) Ġ|| Ġn . code Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġ/** ĊĠĠ Ġ* ĠReads Ġuntil Ġencounter ing Ġa Ġcharacter Ġthat Ġis Ġnot Ġa Ġwhitespace Ġaccording Ġto Ġthe ĊĠĠ Ġ* Ġ[ JSON 5 ĠSpecification ]( https :// spec . json 5 . org /# white - space ) ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return Ġa Ġnon - whitespace Ġcharacter , Ġor Ġ` 0 ` Ġif Ġthe Ġend Ġof Ġthe Ġstream Ġhas Ġbeen Ġreached ĊĠĠ Ġ*/ ĊĠ Ġfun Ġnext Clean (): ĠChar Ġ{ ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! more ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" Unexpected Ġend Ġof Ġdata ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġn Ġ= Ġnext () ĊĠĠĠĠĠ Ġif Ġ( n Ġ== Ġ'/') Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( peek ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ'*' Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Multi Line Comment () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ'/' Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Single Line Comment () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġn ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! is Whitespace ( n )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġnext Clean To ( de limiters : ĠString Ġ= Ġnext Clean To Delimit ers ): ĠString Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder () ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! more ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" Unexpected Ġend Ġof Ġdata ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġn Ġ= Ġnext Clean () ĊĠĠĠĠĠ Ġif Ġ( de limiters . indexOf ( n ) Ġ> Ġ- 1 Ġ|| Ġis Whitespace ( n )) Ġ{ ĊĠĠĠĠĠĠĠ Ġback () ĊĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġresult . append ( n ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult . toString () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġde Hex ( c : ĠChar ): ĠInt ? Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( c ) Ġ{ ĊĠĠĠĠĠ Ġin Ġ' 0 ' .. ' 9 ' Ġ-> Ġc Ġ- Ġ' 0 ' ĊĠĠĠĠĠ Ġin Ġ' a ' .. ' f ' Ġ-> Ġc Ġ- Ġ' a ' Ġ+ Ġ 0 xA ĊĠĠĠĠĠ Ġin Ġ' A ' .. ' F ' Ġ-> Ġc Ġ- Ġ' A ' Ġ+ Ġ 0 xA ĊĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠ Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġunicode Escape ( member : ĠBoolean , Ġpart : ĠBoolean ): ĠChar Ġ{ ĊĠĠĠ Ġvar Ġvalue Ġ= Ġ"" ĊĠĠĠ Ġvar Ġcode point Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 3 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġn Ġ= Ġnext () ĊĠĠĠĠĠ Ġvalue Ġ+= Ġn ĊĠĠĠĠĠ Ġval Ġhex Ġ= Ġde Hex ( n ) ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow Ġcreate Syntax Exception (" Illegal Ġunicode Ġescape Ġsequence Ġ'\\ u $ value ' Ġin Ġ${ if Ġ( member ) Ġ" key " Ġelse Ġ" string "} ") ĊĠĠĠĠĠ Ġcode point Ġ= Ġcode point Ġor Ġ( hex Ġshl Ġ( 3 Ġ- Ġi Ġshl Ġ 2 )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( member Ġ&& Ġ! is Member Name Char ( code point . to Char (), Ġpart )) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" Illegal Ġunicode Ġescape Ġsequence Ġ'\\ u $ value ' Ġin Ġkey ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcode point . to Char () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcheck Sur rogate ( hi : ĠChar , Ġlo : ĠChar ) Ġ{ ĊĠĠĠ Ġif Ġ( j 5 . options . allow Invalid Sur rog ates ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! Character . is High Sur rogate ( hi ) Ġ|| Ġ! Character . is Low Sur rogate ( lo )) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! Character . is Sur rogate Pair ( hi , Ġlo )) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception ( ĊĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġsur rogate Ġpair : ĠU +% 0 4 X Ġand ĠU +% 0 4 X ", ĊĠĠĠĠĠĠĠĠĠ Ġhi , Ġlo ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// Ġhttps :// spec . json 5 . org /# prod - JSON 5 String ĊĠ Ġprivate Ġfun Ġnext String ( quote : ĠChar ): ĠString Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder () ĊĠĠĠ Ġvar Ġvalue : ĠString ĊĠĠĠ Ġvar Ġcode point : ĠInt ĊĠĠĠ Ġvar Ġn Ġ= Ġ 0 . to Char () ĊĠĠĠ Ġvar Ġprev : ĠChar ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! more ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" Unexpected Ġend Ġof Ġdata ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġprev Ġ= Ġn ĊĠĠĠĠĠ Ġn Ġ= Ġnext () ĊĠĠĠĠĠ Ġif Ġ( n Ġ== Ġquote ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( is Line Termin ator ( n ) Ġ&& Ġn . code Ġ!= Ġ 0 x 2 0 2 8 Ġ&& Ġn . code Ġ!= Ġ 0 x 2 0 2 9 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" Un escaped Ġline Ġtermin ator Ġin Ġstring ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( n Ġ== Ġ'\\ ') Ġ{ ĊĠĠĠĠĠĠĠ Ġn Ġ= Ġnext () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Line Termin ator ( n )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Ġ== Ġ'\ r ' Ġ&& Ġpeek () Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġescaped Ġline Ġtermin ator / Ġline Ġcontinuation ĊĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( n ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\' ', Ġ'" ', Ġ'\\ ' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' b ' ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ('\ b ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' f ' ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( Json 5 Escape Sequence . Form Feed . char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' n ' ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ('\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' r ' ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ('\ r ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' t ' ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ('\ t ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' v ' ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( 0 x 0 B . to Char ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' 0 ' ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġpeek () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p . is Digit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" Illegal Ġescape Ġsequence Ġ'\\ 0 $ p '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( 0 . to Char ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' x ' ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode point Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ+= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhex Ġ= Ġde Hex ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow Ġcreate Syntax Exception (" Illegal Ġhex Ġescape Ġsequence Ġ'\\ x $ value ' Ġin Ġstring ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode point Ġ= Ġcode point Ġor Ġ( hex Ġshl Ġ( 1 Ġ- Ġi Ġshl Ġ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ i ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= Ġcode point . to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' u ' ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġn Ġ= Ġunicode Escape ( member Ġ= Ġfalse , Ġpart Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġif Ġ( n . is Digit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSyntax Error (" Illegal Ġescape Ġsequence Ġ'\\ $ n '") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcheck Sur rogate ( prev , Ġn ) ĊĠĠĠĠĠ Ġresult . append ( n ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult . toString () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Member Name Char ( n : ĠChar , Ġis NotEmpty : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( n Ġ== Ġ'$ ' Ġ|| Ġn Ġ== Ġ'_' Ġ|| Ġn . code Ġ== Ġ 0 x 2 0 0 C Ġ|| Ġn . code Ġ== Ġ 0 x 2 0 0 D ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġwhen Ġ( n . category ) Ġ{ ĊĊĠĠĠĠĠ ĠChar Category . UPPER CASE _ LET TER , ĊĠĠĠĠĠ ĠChar Category . LOWER CASE _ LET TER , ĊĠĠĠĠĠ ĠChar Category . TITLE CASE _ LET TER , ĊĠĠĠĠĠ ĠChar Category . MODI FIER _ LET TER , ĊĠĠĠĠĠ ĠChar Category . OTHER _ LET TER , ĊĠĠĠĠĠ ĠChar Category . LET TER _ NUMBER ĠĠĠĠĠĠĠĠ Ġ-> Ġreturn Ġtrue ĊĊĠĠĠĠĠ ĠChar Category . NON _ SPACING _ MARK , ĊĠĠĠĠĠ ĠChar Category . COMB IN ING _ SPACING _ MARK , ĊĠĠĠĠĠ ĠChar Category . DECIMAL _ DIGIT _ NUMBER , ĊĠĠĠĠĠ ĠChar Category . CON NE CTOR _ PUN CT UATION Ġ-> Ġis NotEmpty ĊĊĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReads Ġa Ġmember Ġname Ġfrom Ġthe Ġsource Ġaccording Ġto Ġthe ĊĠĠ Ġ* Ġ[ JSON 5 ĠSpecification ]( https :// spec . json 5 . org /# prod - JSON 5 Member Name ) ĊĠĠ Ġ*/ ĊĠ Ġfun Ġnext Member Name (): ĠString Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder () ĊĠĠĠ Ġvar Ġprev : ĠChar ĊĠĠĠ Ġvar Ġn Ġ= Ġnext () ĊĠĠĠ Ġif Ġ( n Ġ== Ġ'"' Ġ|| Ġn Ġ== Ġ'\' ') Ġ{ ĊĠĠĠĠĠ Ġreturn Ġnext String ( n ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġback () ĊĠĠĠ Ġn Ġ= Ġ 0 . to Char () ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! more ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" Unexpected Ġend Ġof Ġdata ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġis NotEmpty Ġ= Ġresult . isNotEmpty () ĊĠĠĠĠĠ Ġprev Ġ= Ġn ĊĠĠĠĠĠ Ġn Ġ= Ġnext () ĊĠĠĠĠĠ Ġif Ġ( n Ġ== Ġ'\\ ') Ġ{ Ġ// Ġunicode Ġescape Ġsequence ĊĠĠĠĠĠĠĠ Ġn Ġ= Ġnext () ĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ!= Ġ' u ') Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" Illegal Ġescape Ġsequence Ġ'\\ $ n ' Ġin Ġkey ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġn Ġ= Ġunicode Escape ( true , Ġis NotEmpty ) ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! is Member Name Char ( n , Ġis NotEmpty )) Ġ{ ĊĠĠĠĠĠĠĠ Ġback () ĊĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcheck Sur rogate ( prev , Ġn ) ĊĠĠĠĠĠ Ġresult . append ( n ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( result . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" Empty Ġkey ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult . toString () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReads Ġa Ġvalue Ġfrom Ġthe Ġsource Ġaccording Ġto Ġthe ĊĠĠ Ġ* Ġ[ JSON 5 ĠSpecification ]( https :// spec . json 5 . org /# prod - JSON 5 Value ) ĊĠĠ Ġ*/ ĊĠ Ġfun Ġnext Value (): ĠJson Element Ġ{ ĊĠĠĠ Ġwhen Ġ( val Ġn Ġ= Ġnext Clean ()) Ġ{ ĊĠĠĠĠĠ Ġ'" ', Ġ'\'' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Ġ= Ġnext String ( n ) ĊĠĠĠĠĠĠĠ Ġreturn ĠJson Primitive ( string ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ'{ ' ĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġback () ĊĠĠĠĠĠĠĠ Ġreturn Ġj 5 . object Decoder . decode ( this ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ'[' ĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġback () ĊĠĠĠĠĠĠĠ Ġreturn Ġj 5 . array Decoder . decode ( this ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġback () ĊĠĠĠ Ġval Ġstring Ġ= Ġnext Clean To () ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠ Ġstring Ġ== Ġ" null " ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĠJson Null ĊĠĠĠĠĠ ĠP ATTERN _ BOOLEAN . matches ( string ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĠJson Primitive ( string Ġ== Ġ" true ") ĊĊĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġval Ġbigint Ġ= ĠBigInteger ( string ) ĊĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġreturn Ġbigint ĊĠĠĠĠĠ ĠP ATTERN _ NUMBER _ INTEGER . matches ( string ) ĠĠĠĠĠĠĠĠĠĠ Ġ-> ĠJson Primitive ( string . to Long ()) ĊĊĠĠĠĠĠ ĠP ATTERN _ NUMBER _ FLOAT . matches ( string ) ĊĠĠĠĠĠĠĠĠĠ Ġ|| ĠP ATTERN _ NUMBER _ NON _ FIN ITE . matches ( string ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠJson Primitive ( string . toDouble ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow Ġcreate Syntax Exception (" could Ġnot Ġparse Ġnumber Ġ'$ string '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠP ATTERN _ NUMBER _ HEX . matches ( string ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhex Ġ= Ġstring . uppercase (). split (" 0 X "). join ToString ("") ĊĠĠĠĠĠĠĠ ĠJson Primitive ( hex . to Long ( 1 6 )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġthrow ĠJSON Exception (" Illegal Ġvalue Ġ'$ string '") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġcreate Syntax Exception ( message : ĠString , Ġcause : ĠThrowable ? Ġ= Ġnull ): ĠSyntax Error Ġ= ĊĠĠĠ ĠSyntax Error ("$ message , Ġat Ġindex Ġ$ index , Ġcharacter Ġ$ character , Ġline Ġ$ line ]", Ġcause ) ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval ĠP ATTERN _ BOOLEAN Ġ= ĊĠĠĠĠĠ ĠRegex (" true | false ") ĊĠĠĠ Ġprivate Ġval ĠP ATTERN _ NUMBER _ FLOAT Ġ= ĊĠĠĠĠĠ ĠRegex ("[ +- ]? (( 0 |[ 1 - 9 ]\\ d *)( \\. \\ d *) ?| \\. \\ d +) ([ e E ][ +- ]? \\ d + )? ") ĊĠĠĠ Ġprivate Ġval ĠP ATTERN _ NUMBER _ INTEGER Ġ= ĊĠĠĠĠĠ ĠRegex ("[ +- ] ?( 0 |[ 1 - 9 ]\\ d *) ") ĊĠĠĠ Ġprivate Ġval ĠP ATTERN _ NUMBER _ HEX Ġ= ĊĠĠĠĠĠ ĠRegex ("[ +- ]? 0 [ x X ][ 0 - 9 a - fA - F ]+ ") ĊĠĠĠ Ġprivate Ġval ĠP ATTERN _ NUMBER _ NON _ FIN ITE Ġ= ĊĠĠĠĠĠ ĠRegex ("[ +- ] ?( Infinity | NaN )") ĊĠ Ġ} Ċ } Ċ