summaryrefslogtreecommitdiff
path: root/test/liftattrs.lm
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>