##### LM ##### # # Regular Definitions # rl rl_ws /[ \t\n\r\v]+/ rl rl_id /[a-zA-Z_][a-zA-Z0-9_]*/ # # Tokens # lex literal `= `< `> `/ # Ignore whitespace. ignore /rl_ws/ # Open and close id token id /rl_id/ end # # Productions # def attr [id `= id] def attr_list [attr_list attr] | [] def open_tag [`< id attr_list `>] def close_tag [`< `/ id `>] def tag [open_tag item_list close_tag] def item_list [item_list tag] | [] parse ILP: item_list[stdin] IL: item_list = ILP # Get the item list match IL [RootItemList: item_list] # List for collecting the attrs we pull out. CollectedAttrs: attr_list = construct attr_list [] # Iterate through all attributes for AttrListIter:attr_list in RootItemList { # If the name of the attr is foo, remove it. if match AttrListIter [SubAttrList:attr_list "foo=" Val:id] { # Remove the attribute AttrListIter = construct attr_list [SubAttrList] # Add it to the colection CollectedAttrs = construct attr_list [CollectedAttrs " foo=" ^Val] } } # Reconstruct the left hand side with the IL = construct item_list ["" ^RootItemList ""] print( ^IL '\n' ) ##### IN ##### ##### EXP #####