def parse_element_ruleset
assert unless @token == :element
scan()
@token == :string or raise parse_error("'#{@value}': element name required in string.")
name = @value
name =~ /\A\w+\z/ or raise parse_error("'#{@value}': invalid element name.")
scan()
@token == '{''{' or raise parse_error("'#{@value}': '{' required.")
ruleset = ElementRuleset.new(name)
while true
scan()
flag_escape = escape?(@value)
break unless @token
case @token
when :stag ; has_space? ; ruleset.set_stag _parse_item() , flag_escape
when :cont ; has_space? ; ruleset.set_cont _parse_item() , flag_escape
when :etag ; has_space? ; ruleset.set_etag _parse_item() , flag_escape
when :elem ; has_space? ; ruleset.set_elem _parse_item() , flag_escape
when :value ; has_space? ; ruleset.set_value _parse_item() , flag_escape
when :attrs ; has_space? ; ruleset.set_attrs _parse_tuples() , flag_escape
when :append ; has_space? ; ruleset.set_append _parse_list() , flag_escape
when :remove ; has_space? ; ruleset.set_remove _parse_strs()
when :tagname ; has_space? ; ruleset.set_tagname _parse_str()
when :logic ; has_space? ; ruleset.set_logic _parse_block()
when '}''}' ; break
else ; raise parse_error("'#{@value}': invalid token.")
end
end
assert unless token == '}''}'
scan()
return ruleset
end