package ĠHand lers Ċ Ċ import ĠListener . First Table Listener Ċ import ĠListener . LL 1 Listener Ċ import ĠListener . Parser Listener Ċ import ĠUtils . Generator Util Ċ import ĠUtils . State Ċ import ĠUtils . Terminal Ċ import Ġjavax . swing . table . Default TableModel Ċ Ċ object ĠMain Handler Ġ{ ĊĊĠĠĠ Ġfun Ġrun ( ĊĠĠĠĠĠĠĠ Ġrules : ĠHashMap < State , ĠSet < Pair < State , ĠInt >>> ĊĠĠĠĠĠĠĠ Ġ, Ġnon Terminal : ĠSet < String > ĊĠĠĠĠĠĠĠ Ġ, ĠTerminal : ĠSet < Terminal > ĊĠĠĠĠĠĠĠ Ġ, Ġfollows : ĠHashMap < String , ĠHashSet < String >> ĊĠĠĠĠĠĠĠ Ġ, Ġfirst s : ĠHashMap < String , ĠHashSet < String >> ĊĠĠĠĠĠĠĠ Ġ, Ġlistener : ĠLL 1 Listener ĊĠĠĠ Ġ) Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠHashMap < Pair < State , ĠState >, ĠInt > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġval Ġtable Data : ĠHashMap < State , ĠMutable List < Int >> Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġval Ġtable L HS : ĠHashSet < State > Ġ= ĠHashSet () ĊĊĊĠĠĠĠĠĠĠ Ġprintln (" rules Ġ: Ġ$ rules ") ĊĠĠĠĠĠĠĠ Ġprintln (" non Terminal Ġ: Ġ$ non Terminal ") ĊĠĠĠĠĠĠĠ Ġprintln (" Terminal Ġ: Ġ$ Terminal ") ĊĠĠĠĠĠĠĠ Ġprintln (" follow s Ġ: Ġ$ follow s ") ĊĠĠĠĠĠĠĠ Ġprintln (" first s Ġ: Ġ$ first s ") ĊĊĊĠĠĠĠĠĠĠ Ġval Ġtable Ġ= ĠDefault TableModel () ĊĊĊĠĠĠĠĠĠĠ Ġrules . forEach Ġ{ ĠL HS , ĠRHS Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRHS . forEach Ġ{ ĠRule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= ĠGenerator Util . getChildren ( Rule . first ). first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfollows [ L HS ]?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Ġ== Ġ" Îµ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ L HS Ġto Ġit ] Ġ= ĠRule . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġdata [ L HS Ġto Ġit ] Ġ= ĠInt . MIN _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrules . forEach Ġ{ ĠL HS , ĠRHS Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRHS . forEach Ġ{ ĠRule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= ĠGenerator Util . getChildren ( Rule . first ). first () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Terminal . any Ġ{ Ġit Ġ== Ġfirst Ġ&& Ġfirst Ġ!= Ġ" Îµ " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ L HS Ġto Ġfirst ] Ġ= ĠRule . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ_ first s Ġ= Ġfirst s [ first ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ first s ?. forEach Ġ{ Ġdata [ L HS Ġto Ġit ] Ġ= ĠRule . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// println (" Data Ġ: Ġ$ data ") ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠGenerate ĠNon Terminal ĊĠĠĠĠĠĠĠ Ġdata . keys . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! table L HS . contains ( it . first )) Ġtable L HS . add ( it . first ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġtable . addColumn ("", Ġtable L HS . to Typed Array ()) Ġ// ĠAdd ĠNon Terminal ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠGenerate ĠTable ĠData ĊĠĠĠĠĠĠĠ Ġdata . forEach Ġ{ ĠL HS , ĠRHS Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! table Data . containsKey ( L HS . second )) Ġtable Data [ L HS . second ] Ġ= ĠFill List ( non Terminal . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable Data [ L HS . second ]?. set ( table L HS . indexOf ( L HS . first ), ĠRHS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// println (" table Data Ġ: Ġ$ table Data ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet ĠTable ĠData ĊĠĠĠĠĠĠĠ Ġtable Data . forEach Ġ{ ĠName , ĠColumn Set Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove ĠMIN _ VALUE Ġin ĠTable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠColumn : ĠMutable List < Any > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin ĠColumn Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== ĠInt . MIN _ VALUE ) ĠColumn . add ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠColumn . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable . addColumn ( Name , ĠColumn . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlistener . done ( table , Ġdata ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġcheck ( ĊĠĠĠĠĠĠĠ Ġdata : ĠString ĊĠĠĠĠĠĠĠ Ġ, Ġstart : ĠState ĊĠĠĠĠĠĠĠ Ġ, Ġtable : ĠHashMap < Pair < State , ĠState >, ĠInt > ĊĠĠĠĠĠĠĠ Ġ, Ġrules : ĠHashMap < State , ĠSet < Pair < State , ĠInt >>> ĊĠĠĠĠĠĠĠ Ġ, Ġlistener : ĠParser Listener ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġrule Step Ġ= Ġ"$ start Ġ$ ". trim () ĊĠĠĠĠĠĠĠ Ġvar Ġinput Step Ġ= Ġ"$ data Ġ$ ". trim () ĊĊĠĠĠĠĠĠĠ Ġprint ("\ n \ n \ n \ n ") ĊĠĠĠĠĠĠĠ Ġprintln (" data Ġ: Ġ$ input Step ") ĊĠĠĠĠĠĠĠ Ġprintln (" start Ġ: Ġ$ rule Step ") ĊĠĠĠĠĠĠĠ Ġprintln (" table Ġ: Ġ$ table ") ĊĠĠĠĠĠĠĠ Ġprintln (" rules Ġ: Ġ$ rules ") ĊĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠRF Ġ= Ġget First ( rule Step ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠIF Ġ= Ġget First ( input Step ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" RF Ġ: Ġ$ RF ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" IF Ġ: Ġ$ IF ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rule Step Ġ== Ġ"$ " Ġ&& Ġinput Step Ġ== Ġ"$ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Result ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rule Step Ġ== Ġ"$ " Ġ&& Ġinput Step Ġ!= Ġ"$ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Result ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( RF Ġ== ĠIF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrule Step Ġ= Ġrule Step . remove Prefix ( RF ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Step Ġ= Ġinput Step . remove Prefix ( IF ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" RF Ġ== ĠIF Ġ, ĠSo ĠRemove Prefix ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" rule Step Ġ: Ġ$ rule Step Ġ Ġ, Ġinput Step Ġ: Ġ$ input Step ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Rule Num Ġ= Ġtable [ RF Ġto ĠIF ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" next Rule Num Ġ: Ġ$ next Rule Num ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Rule Num Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Result ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġget Rule Value ( rules , Ġnext Rule Num ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Ġ== Ġ" Îµ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrule Step Ġ= Ġrule Step . remove Prefix ( RF ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ RF ĠRemoved ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrule Step Ġ= Ġrule Step . remove Prefix ( RF ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Remove Prefix Rule Step Ġ: Ġ$ rule Step ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrule Step Ġ= ĠString ("$ next Ġ$ rule Step ". toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" New Rule Step Ġ: Ġ$ rule Step ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget First ( str : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstr . split (' Ġ'). first () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Rule Value ( ĊĠĠĠĠĠĠĠ Ġrules : ĠHashMap < State , ĠSet < Pair < State , ĠInt >>> ĊĠĠĠĠĠĠĠ Ġ, Ġrule Num : ĠInt ĊĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġret Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġfor Ġ(( _, ĠRHS ) Ġin Ġrules ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( rule Ġin ĠRHS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rule . second Ġ== Ġrule Num ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġrule . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret . isNotEmpty ()) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġret . trim () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFill List ( count : ĠInt ): ĠMutable List < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠMutable List < Int > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcount ) Ġlist . add ( Int . MIN _ VALUE ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġgenerate First Table ( first s : ĠHashMap < State , ĠHashSet < State >>, Ġlistener : ĠFirst Table Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdef Ġ= ĠDefault TableModel () ĊĠĠĠĠĠĠĠ Ġfirst s . forEach Ġ{ Ġt , Ġu Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdef . addColumn ( t , Ġu . toArray ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlistener . on Done ( def ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Follow Table ( follow : ĠHashMap < State , ĠHashSet < State >>, Ġlistener : ĠFirst Table Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdef Ġ= ĠDefault TableModel () ĊĠĠĠĠĠĠĠ Ġfollow . forEach Ġ{ Ġt , Ġu Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdef . addColumn ( t , Ġu . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlistener . on Done ( def ) ĊĠĠĠ Ġ} Ċ }