def parse_move
      s0 = @current_pos
      s1 = parse_line
      if s1 != :failed
        s2 = []
        s3 = parse_comment
        while s3 != :failed
          s2 << s3
          s3 = parse_comment
        end
        parse_pointer
        s4 = []
        s5 = parse_nl
        s5 = match_space if s5 == :failed
        while s5 != :failed
          s4 << s5
          s5 = parse_nl
          s5 = match_space if s5 == :failed
        end
        @reported_pos = s0
        s0 = -> (line, c) do
          ret = { "move" => line }
          ret["comments"] = c if !c.empty?
          ret
        end.call(s1, s2)
      else
        @current_pos = s0
        s0 = :failed
      end

      s0
    end
def parse_move
      s0 = @current_pos
      s1 = parse_line
      if s1 != :failed
        s2 = []
        s3 = parse_comment
        while s3 != :failed
          s2 << s3
          s3 = parse_comment
        end
        parse_pointer
        s4 = []
        s5 = parse_nl
        s5 = match_space if s5 == :failed
        while s5 != :failed
          s4 << s5
          s5 = parse_nl
          s5 = match_space if s5 == :failed
        end
        @reported_pos = s0
        s0 = -> (line, c) do
          ret = { "move" => line }
          ret["comments"] = c if !c.empty?
          ret
        end.call(s1, s2)
      else
        @current_pos = s0
        s0 = :failed
      end

      s0
    end
move : line comment* pointer? (nl | " ")*