def parse_newenvironment
case
when @scanner.scan_block
env = @scanner[1]
when @scanner.scan_command
raise ParseError.new
when @scanner.scan(/./)
env = @scanner.matched
end
raise parse_error("Syntax error.", env[/\A.*?(\\.*\z)/, 1], @scanner.matched) if env=~/\\/
optnum = scan_num_of_parameter
opt = @scanner.scan_option ? @scanner[1] : nil
b = @scanner.scan_block ? @scanner[1] : @scanner.scan_any
raise parse_error("Need begin block.") unless b
check_parameter_numbers(b, optnum, @scanner.matched)
e = @scanner.scan_block ? @scanner[1] : @scanner.scan_any
raise parse_error("Need end block.") unless e
check_parameter_numbers(e, optnum, @scanner.matched)
optnum -= 1 if opt
@environments[env] = Environment.new(optnum, b, e, opt)
end