diff options
Diffstat (limited to 'colm/prog.lm')
-rw-r--r-- | colm/prog.lm | 88 |
1 files changed, 48 insertions, 40 deletions
diff --git a/colm/prog.lm b/colm/prog.lm index 635f0d92..f024228f 100644 --- a/colm/prog.lm +++ b/colm/prog.lm @@ -7,10 +7,6 @@ A: str = argv->pop() F: stream = open( A, 'r' ) parse P: start [ F ] -def new_roots - [new_roots root_item] -| [] - prod_list cons_prod( SLA: prod_sublist ) { if match SLA [Left: prod_sublist BAR prod_el_list] @@ -19,58 +15,70 @@ prod_list cons_prod( SLA: prod_sublist ) return cons prod_list[ '[ ' SLA.prod_el_list ' ]' ] } -void rewrite( P: ref<start> ) -{ - Modified: bool = false - cons Additional: new_roots [] +alias prod_map map<prod_list, id> +alias unique_prod map_el<prod_list, id> - for PE: prod_el in P { - if match PE - [OptName: opt_prod_el_name POPEN PS: prod_sublist PCLOSE OptRep: opt_repeat] +global PM: prod_map = new prod_map() +global NextId: int = 1 +global Modified: bool = false + +cfl_def rewrite_cfl_def( CflDef: ref<cfl_def> ) +{ + NewDef: cfl_def + for PE: prod_el in CflDef { + if match PE [ + OptName: opt_prod_el_name POPEN PS: prod_sublist PCLOSE OptRep: opt_repeat] { - PE = cons prod_el - [OptName "_sublist_" OptRep] + PL: prod_list = cons_prod(PS) - cons Def: cfl_def - "def _sublist_ [cons_prod(PS)]" + Name: id = PM->find( PL ) + if ( !Name ) { + Name = parse id + "_sublist_[sprintf("%d", NextId)]" + NextId = NextId + 1 - Additional = cons new_roots - [Additional Def] - } -# else if match PE -# [OptName: opt_prod_el_name Qual: region_qual Id: id "<*"] -# { -# parse LeftRepId: id "_lrep_[Id]" -# PE = cons prod_el [OptName Qual LeftRepId] -# -# cons Def: cfl_def "def [LeftRepId] \[[LeftRepId] [Id]\] | \[\] -# -# Additional = cons new_roots [Additional Def] -# } - else if match PE - [OptName: opt_prod_el_name Qual: region_qual Id: id "<+"] - { - parse LeftRepId: id "_lrep_[Id]" + PM->insert( PL, Name ) - PE = cons prod_el [OptName Qual LeftRepId] + NewDef = cons cfl_def + "def [Name] [PL]" + } - cons Def: cfl_def "def [LeftRepId] \[[LeftRepId] [Id]\] | \[[Id]\] + PE = cons prod_el + [OptName Name OptRep " "] - Additional = cons new_roots [Additional Def] + Modified = true } } + return NewDef +} + +void rewrite( P: ref<start> ) +{ + Modified = false + + for RIL: root_item<* in P { + require RIL [Head: root_item<* CflDef: cfl_def] + + NewDef: cfl_def + + NewDef = rewrite_cfl_def( CflDef ) + + if NewDef { + RIL = cons root_item<* [Head NewDef "\n\n" CflDef] + Modified = true + } + else { + RIL = cons root_item<* [Head CflDef] + } - while ( Additional.root_item ) { - P = cons start [P.RootItemList Additional.root_item] - Additional = Additional._new_roots - Modified = true } + return Modified } if P { while ( rewrite( P ) ) {} - #rewrite( P ) + #print "final:\n[P] } ColmTree = P |