package Ġcom . pal ml ang . pal m . lexer . functions Ċ Ċ import Ġcom . pal ml ang . pal m . lexer . Lexer Ċ import Ġcom . pal ml ang . pal m . lexer . Token Ċ import Ġcom . pal ml ang . pal m . util . String Pos Ċ Ċ internal Ġfun ĠLex er . lex String ( start Delim : ĠToken . String Start , Ġhashes : ĠInt ) Ġ{ ĊĠĠĠ Ġvar Ġpos Ġ= Ġthis . pos ĊĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĊĠĠĠ Ġwhile Ġ( true ) Ġwhen Ġ( val Ġchar Ġ= Ġcode . get OrNull ( pos )) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Err (" Missing Ġdouble Ġquote ", Ġpos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfinish String ( builder , Ġpos , Ġstart Delim , Ġpos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ'"' Ġ-> Ġif Ġ( hash Num Eq ( code , Ġpos Ġ+ Ġ 1 , Ġhashes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfinish String ( builder , Ġpos , Ġstart Delim , Ġpos Ġ+ Ġ 1 Ġ+ Ġhashes ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ('" ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ'$ ' Ġ-> Ġpos Ġ= Ġhandle Dollar Sign ( pos , Ġbuilder ) ĊĠĠĠĠĠĠĠ Ġ'\\ ' Ġ-> Ġpos Ġ= Ġhandle Esc aped ( pos Ġ+ Ġ 1 , Ġhashes , Ġbuilder :: append ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠLex er . finish String ( ĊĠĠĠ Ġbuilder : ĠStringBuilder , ĊĠĠĠ Ġpos : ĠString Pos , ĊĠĠĠ Ġstart Delim : ĠToken . String Start , ĊĠĠĠ Ġend Pos : ĠString Pos Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcontents Ġ= Ġbuilder . toString () ĊĠĠĠ ĠToken . String Port ion ( contents ). add ( pos ) ĊĠĠĠ Ġstart Delim . end Index Ġ= Ġtokens . size ĊĠĠĠ ĠToken . String End . add ( end Pos ) Ċ } Ċ Ċ private Ġfun ĠLex er . handle Dollar Sign ( ĊĠĠĠ Ġpos : ĠString Pos , ĊĠĠĠ Ġbuilder : ĠStringBuilder Ċ ): ĠString Pos Ġ{ ĊĠĠĠ Ġval Ġinter Pos Ġ= Ġpos Ġ+ Ġ 1 ĊĠĠĠ Ġreturn Ġwhen Ġ( val Ġchar Ġ= Ġcode . get OrNull ( inter Pos )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ'{ ' Ġ-> Ġhandle Interpolation ( builder , Ġpos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlex Br aces () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ' `' Ġ-> Ġhandle Interpolation ( builder , Ġpos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlex Tick ed Ident ( inter Pos Ġ+ Ġ 1 , ĠStringBuilder ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġin Ġident Start Chars Ġ-> Ġhandle Interpolation ( builder , Ġpos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlex Normal Ident ( inter Pos Ġ+ Ġ 1 , ĠStringBuilder (). append ( char )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ('$ ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinter Pos ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġinline Ġfun ĠLex er . handle Interpolation ( builder : ĠStringBuilder , Ġpos : ĠString Pos , Ġfn : ĠLex er . () Ġ-> ĠUnit ): ĠString Pos Ġ{ ĊĠĠĠ Ġval Ġcontents Ġ= Ġbuilder . toString () ĊĠĠĠ ĠToken . String Port ion ( contents ). add ( pos ) ĊĠĠĠ ĠToken . Interpolation . add () ĊĠĠĠ Ġfn () ĊĠĠĠ Ġbuilder . clear () ĊĠĠĠ Ġreturn Ġthis . pos Ċ }