def parse_stmt_elem
Kwartz::assert() unless token() == :elem
scan()
_syntaxerr("':elem' requires '('.") unless token() == '('
scan()
name_expr = parse_expression()
_syntaxerr("':elem(' is not closed.") unless token() == ')'
scan()
_syntaxerr("':elem' requires an element name.") unless name_expr.token == :variable
name = name_expr.left
_push_element_name(name)
nodelist = parse_stmt_list()
_syntaxerr("':elem' is not closed by ':end'.") unless token() == :end
_pop_element_name()
scan()
return MacroStmtNode.new(:macro, 'elem_' + name, nodelist)
end