##### 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 #####