package Ġast miner . feature extraction Ċ Ċ import Ġast miner . common . model . Node Ċ Ċ class ĠPretty Node ( private Ġval Ġtype : ĠString , Ġprivate Ġval Ġtoken : ĠString ) Ġ: ĠNode Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġchildren : ĠMutable List < Pretty Node > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġvar Ġparent : ĠPretty Node ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġmetadata : ĠMutable Map < String , ĠAny > Ġ= ĠHashMap () ĊĊĠĠĠ Ġoverride Ġfun Ġget Children (): ĠMutable List < Pretty Node > Ġ= Ġ Ġchildren ĊĊĠĠĠ Ġoverride Ġfun ĠgetParent (): ĠPretty Node ? Ġ= Ġparent ĊĊĠĠĠ Ġfun Ġadd Child ( node : ĠPretty Node ) Ġ= Ġchildren . add ( node ) ĊĊĠĠĠ Ġfun Ġset Parent ( node : ĠPretty Node ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode ?. addChild ( this ) ĊĠĠĠĠĠĠĠ Ġparent Ġ= Ġnode ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Pretty String ( indent : ĠInt Ġ= Ġ 0 , Ġindent Symbol : ĠString Ġ= Ġ"-- ") Ġ: ĠString Ġ= Ġwith ( StringBuilder ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( indent ) Ġ{ Ġappend ( indent Symbol ) Ġ} ĊĠĠĠĠĠĠĠ Ġappend ( getType Label ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( getToken (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln (" Ġ: Ġ${ getToken () }") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget Children (). forEach Ġ{ Ġappend ( it . to Pretty String ( indent Ġ+ Ġ 1 , Ġindent Symbol )) Ġ} ĊĠĠĠĠĠĠĠ ĠtoString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetToken (): ĠString Ġ= Ġ Ġtoken ĊĊĠĠĠ Ġoverride Ġfun Ġis Leaf (): ĠBoolean Ġ= Ġ Ġchildren . isEmpty () ĊĊĠĠĠ Ġoverride Ġfun Ġget Metadata ( key : ĠString ): ĠAny ? Ġ= Ġmetadata [ key ] ĊĊĠĠĠ Ġoverride Ġfun Ġset Metadata ( key : ĠString , Ġvalue : ĠAny ) Ġ= Ġmetadata . set ( key , Ġvalue ) ĊĊĠĠĠ Ġoverride Ġfun ĠgetType Label (): ĠString Ġ= Ġtype Ċ Ċ } Ċ Ċ fun Ġrestore From Pretty Print ( pretty Print ed Tree : ĠString , Ġindent Symbol : ĠString Ġ= Ġ"-- ") Ġ: ĠPretty Node ? Ġ{ ĊĠĠĠ Ġval Ġlast Node By Indent Ġ= ĠHashMap < Int , ĠPretty Node >() ĊĠĠĠ Ġval Ġtree Ġ= Ġpretty Print ed Tree . lines (). map Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġ( node , Ġindent ) Ġ= Ġrestore Print ed Node ( s , Ġindent Symbol ) ĊĠĠĠĠĠĠĠ Ġlast Node By Indent [ indent ] Ġ= Ġnode ĊĠĠĠĠĠĠĠ Ġnode . setParent ( last Node By Indent [ indent Ġ- Ġ 1 ]) ĊĠĠĠĠĠĠĠ Ġnode ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtree . first () Ċ } ĊĊ Ċ fun Ġrestore Print ed Node ( print ed Node : ĠString , Ġindent Symbol : ĠString Ġ= Ġ"-- ") Ġ: ĠPair < Pretty Node , ĠInt > Ġ{ ĊĠĠĠ Ġval Ġindent s Ġ= ĠRegex ("^ ($ indent Symbol )* "). find ( print ed Node )?. value Ġ?: Ġ"" ĊĠĠĠ Ġval Ġnode String Ġ= Ġprinted Node . substring After ( indent s ) ĊĠĠĠ Ġval Ġtype Ġ= Ġ Ġnode String . substring Before (" Ġ: Ġ") ĊĠĠĠ Ġval Ġtoken Ġ= Ġnode String . substring After (" Ġ: Ġ", Ġ"") ĊĠĠĠ Ġval Ġindent Ġ= Ġindent s . length Ġ/ Ġindent Symbol . length ĊĠĠĠ Ġreturn ĠPretty Node ( type , Ġtoken ) Ġto Ġindent Ċ } Ċ