def parse_stmt_macro
Kwartz::assert() unless token() == :macro || token() == :elem
scan()
_syntaxerr("':macro' requires '('.") unless token() == '('
scan()
name_expr = parse_expression()
_syntaxerr("':macro(' is not closed.") unless token() == ')'
scan()
_syntaxerr("':macro' requires a name.") unless name_expr.token == :variable
name = name_expr.left
nodelist = parse_stmt_list()
_syntaxerr("':macro' is not closed by ':end'.") unless token() == :end
scan()
return MacroStmtNode.new(:macro, name, nodelist)
end