blob: c94aaebf06574525b18650083bf1e785d5fa48a7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#
# 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
["<wrapper " ^CollectedAttrs ">" ^RootItemList "</wrapper>"]
print( ^IL, '\n' )
##### IN #####
<t1 a=b foo=bar1 c=d>
<t2 foo=bar2 e=f></t2>
</t1>
##### EXP #####
<wrapper foo=bar1 foo=bar2><t1 a=b c=d>
<t2 e=f></t2>
</t1></wrapper>
|