/** Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 Ġ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 . ag l . processor Ċ Ċ import Ġnet . ake hur st . language . ag l . grammar . Grammar Registry Default Ċ import Ġnet . ake hur st . language . ag l . grammar . format . A gl Format Grammar Ċ import Ġnet . ake hur st . language . ag l . grammar . format . A gl Format Syntax Analy ser Ċ import Ġnet . ake hur st . language . ag l . grammar . grammar . A gl Grammar Grammar Ċ import Ġnet . ake hur st . language . ag l . grammar . grammar . A gl Grammar Semantic Analy ser Ċ import Ġnet . ake hur st . language . ag l . grammar . grammar . A gl Grammar Syntax Analy ser Ċ import Ġnet . ake hur st . language . ag l . grammar . style . A gl Style Grammar Ċ import Ġnet . ake hur st . language . ag l . grammar . style . A gl Style Syntax Analy ser Ċ import Ġnet . ake hur st . language . api . processor . Language Definition Ċ import Ġnet . ake hur st . language . api . semantic Analy ser . Semantic Analy ser Ċ import Ġnet . ake hur st . language . api . syntax Analy ser . Syntax Analy ser Ċ Ċ interface ĠA gl Languages Ġ{ ĊĠĠĠ Ġval Ġgrammar Language Identity : ĠString ĊĠĠĠ Ġval Ġstyle Language Identity : ĠString ĊĠĠĠ Ġval Ġformat Language Identity : ĠString ĊĊĠĠĠ Ġval Ġgrammar : ĠLanguage Definition ĊĠĠĠ Ġval Ġstyle : ĠLanguage Definition ĊĠĠĠ Ġval Ġformat : ĠLanguage Definition Ċ } Ċ Ċ class ĠLanguage Registry Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ registry Ġ= Ġmutable Map Of < String , ĠLanguage Definition >() ĊĊĠĠĠ Ġval Ġa gl Ġ= Ġobject Ġ: ĠA gl Languages Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġgrammar Language Identity : ĠString Ġ= Ġ" net . ake hur st . language . ag l . A gl Grammar " ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġstyle Language Identity : ĠString Ġ= Ġ" net . ake hur st . language . ag l . A gl Style " ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġformat Language Identity : ĠString Ġ= Ġ" net . ake hur st . language . ag l . A gl Format " ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġgrammar Ġ= Ġthis @ Language Registry . register From Definition ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLanguage Definition From Asm ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Ġ= Ġgrammar Language Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrammar Ġ= ĠA gl Grammar Grammar (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Goal Rule Ġ= ĠA gl Grammar Grammar . goal Rule Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' namespace ' Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġdark green ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġbold ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' grammar ' Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġdark green ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġbold ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' extends ' Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġdark green ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġbold ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' override ' Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġdark green ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġbold ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' skip ' Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġdark green ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġbold ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' leaf ' Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġdark green ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġbold ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ITERAL Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġblue ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP ATTERN Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġdark blue ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIDENT IFIER Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġdark red ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġitalic ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsyntax Analy ser Ġ= ĠA gl Grammar Syntax Analy ser ( Grammar Registry Default ), Ġ// TODO : Ġenable Ġthe Ġregistry Ġto Ġbe Ġchanged , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemantic Analy ser Ġ= ĠA gl Grammar Semantic Analy ser () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġstyle Ġ= Ġthis @ Language Registry . register From Definition ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLanguage Definition From Asm ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Ġ= Ġstyle Language Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrammar Ġ= ĠA gl Style Grammar (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Goal Rule Ġ= ĠA gl Style Grammar . goal Rule Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMETA _ IDENTIFIER Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġorange ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġbold ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIDENT IFIER Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġblue ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġbold ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ITERAL Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġblue ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġbold ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP ATTERN Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġdark blue ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġbold ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTYLE _ ID Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground : Ġdark red ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont - style : Ġitalic ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsyntax Analy ser Ġ= ĠA gl Style Syntax Analy ser (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemantic Analy ser Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġformat Ġ= Ġthis @ Language Registry . register From Definition ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLanguage Definition From Asm ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Ġ= Ġformat Language Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrammar Ġ= ĠA gl Format Grammar (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Goal Rule Ġ= ĠA gl Format Grammar . goal Rule Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsyntax Analy ser Ġ= ĠA gl Format Syntax Analy ser (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemantic Analy ser Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister From Definition ( definition : ĠLanguage Definition ): ĠLanguage Definition Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this ._ registry . containsKey ( definition . identity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Language Definition Ġ'${ definition . identity }' Ġis Ġalready Ġregistered , Ġplease Ġunregister Ġthe Ġold Ġone Ġfirst ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ registry [ definition . identity ] Ġ= Ġdefinition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefinition ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister ( ĊĠĠĠĠĠĠĠ Ġidentity : ĠString , Ġgrammar : ĠString , Ġdefault Goal Rule : ĠString ?, ĊĠĠĠĠĠĠĠ Ġstyle : ĠString ?, Ġformat : ĠString ?, Ġsyntax Analy ser : ĠSyntax Analy ser ?, Ġsemantic Analy ser : ĠSemantic Analy ser ? ĊĠĠĠ Ġ): ĠLanguage Definition Ġ= Ġthis . register From Definition ( ĊĠĠĠĠĠĠĠ ĠLanguage Definition Default ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentity , Ġgrammar , Ġdefault Goal Rule , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle , Ġformat , Ġsyntax Analy ser , Ġsemantic Analy ser ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġunregister ( identity : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis ._ registry . remove ( identity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind OrNull ( identity : ĠString ): ĠLanguage Definition ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ._ registry [ identity ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Or Placeholder ( identity : ĠString ): ĠLanguage Definition Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġthis . find OrNull ( identity ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( null Ġ== Ġexisting ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplaceholder Ġ= ĠLanguage Definition Default ( identity , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister From Definition ( placeholder ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }